時間のかかっている処理を抜き出す


時間のかかっている処理を抜き出す

デバッグで、ソースコードのなかで時間のかかっている処理を抜き出すってことありますよね。
時間がかかっているかどうかは、ある行と次の行のあいだの経過時間を調べればよいです。
それを、もとのソースコードには、極力書き足さずに実現したいです。
書き足さずにというのは、どうせその経過時間を計るコードは、すぐに消去することになるからです。消去するので、極力、短くてシンプルにしておきたい。

こんなクラスを作りました。

それでこんなクラスを作りました。

フィールドで初期化して。
DebugUtilities.DebugTimeCounter logs = new DebugUtilities.DebugTimeCounter();

計測する行に、
logs.Add(linenumber);
と、書き足します。

2017/08/11追記

oo2kazumaさんに、結果を文字列で返す方式、結果を0でパディング、アクセス修飾子の変更など、大幅に手を加えていただきました。ありがとうございました。

using System;
using System.Collections.Generic;
using System.Linq;

namespace DebugUtilities{
    /// <summary>
    /// usage  DebugUtilities.DebugTimeCounter logs = new DebugUtilities.DebugTimeCounter();
    ///    logs.Add(linenumber);
    /// </summary>
    public class DebugTimeCounter
    {
        private static DateTime lastaccesstime = DateTime.Now;
        private static IList<DebugTimeCounterLog> Logs = new List<DebugTimeCounterLog>();
        private const string LOG_HEADER = "fff linenumber";
        private const string LOG_FORMAT = "{0:000} {1:00000}"; // ミリ秒3桁 linenumber5桁想定
        public void Add(int linenumber)
        {
            Add(linenumber, DateTime.Now);
        }
        public void Add(string line)
        {
            Add(0, DateTime.Now, line);
        }

        public void Add(int linenumber, DateTime logtime, string line = "")
        {
            var log = new DebugTimeCounterLog()
            {
                LineNumber = linenumber,
                LineContent = line,
                BetweenTimes = logtime - lastaccesstime
            };
            Logs.Add(log);
            lastaccesstime = logtime;
        }


        public void Clear()
        {
            Logs.Clear();
            lastaccesstime = DateTime.Now;
        }
        public string GetLog()
        {
            var log = new List<String>();
            log.Add(LOG_HEADER);
            log.AddRange(Logs.Select(ValidationConstraints => string.Format(LOG_FORMAT, ValidationConstraints.BetweenTimesFFF, ValidationConstraints.LineNumber, ValidationConstraints.LineContent)));
            return String.Join(Environment.NewLine,log.ToArray<string>()) ;
        }
    }

    public class DebugTimeCounterLog
    {
        public int LineNumber { get; set; }
        private TimeSpan betweenTimes;
        public TimeSpan BetweenTimes { get { return betweenTimes; } set { betweenTimes = value; } }
        public int BetweenTimesFFF { get { return betweenTimes.Milliseconds; } }
        private string lineContent = string.Empty;
        public string LineContent {
            get { return lineContent; }
            set { lineContent = value; }
        }
    }
}