時間のかかっている処理を抜き出す
時間のかかっている処理を抜き出す
デバッグで、ソースコードのなかで時間のかかっている処理を抜き出すってことありますよね。
時間がかかっているかどうかは、ある行と次の行のあいだの経過時間を調べればよいです。
それを、もとのソースコードには、極力書き足さずに実現したいです。
書き足さずにというのは、どうせその経過時間を計るコードは、すぐに消去することになるからです。消去するので、極力、短くてシンプルにしておきたい。
こんなクラスを作りました。
それでこんなクラスを作りました。
フィールドで初期化して。
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; }
}
}
}
Author And Source
この問題について(時間のかかっている処理を抜き出す), 我々は、より多くの情報をここで見つけました https://qiita.com/KaoruHeart/items/2da645b75409d55fd334著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .