我想测试一个方法运行需要多长时间,我想知道时间跨度是否是最好的方法?我不想记录方法的开始和结束,因为我听说记录不会给出准确的时间读数,因为创建和更新现有日志文件需要时间。如果时间跨度不是最好的方法,关于什么是这样做的好方法有什么建议吗?
问问题
1437 次
5 回答
6
最好使用专为此类事情设计的 Stopwatch 类。
http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.aspx
Stopwatch stopWatch = new Stopwatch();
stopWatch.Start();
DoSomething();
stopWatch.Stop();
// Get the elapsed time as a TimeSpan value.
TimeSpan ts = stopWatch.Elapsed;
于 2012-10-11T17:49:25.340 回答
3
var duration = Measure(() => YourFunction(param1));
long Measure(Action action)
{
Stopwatch sw = Stopwatch.StartNew();
action();
return sw.ElapsedMilliseconds;
}
于 2012-10-11T17:52:24.540 回答
2
我Stopwatch
用来计时我的代码。
var sw = new Stopwatch();
sw.Start()
//code to time here
sw.Stop();
Console.WriteLine("Time taken in milliseconds: " + sw.ElapsedMilliseconds);
您可以使用秒表对您的时间安排非常感兴趣。我用它来测试嵌套执行,以及平均多个循环迭代所花费的时间。
要测试多次迭代,请执行以下操作:
var sw = new Stopwatch();
List<long> totalTime = new List<long>();
for (var u = 0; u < 100000; u++)
{
sw.Start();
//logic here
sw.Stop();
totalTime.Add(sw.ElapsedMilliseconds);
sw.Reset();
}
Console.WriteLine("Average time in Milliseconds: {0}", totalTime.Average());
于 2012-10-11T17:48:56.137 回答
2
您想使用 Stopwatch 类。
于 2012-10-11T17:49:20.980 回答
2
你应该使用这个Stopwatch
类:
public void Foo()
{
var sw = Stopwatch.StartNew();
// Do work...
var totalTime = sw.Elapsed;
}
我经常让自己成为一个实用的方法来处理这个问题:
public static void ComputeTimings(Action method, string methodName)
{
var sw = Stopwatch.StartNew();
method();
sw.Stop();
Debug.WriteLine("Method {0} took {1}", methodName, sw.Elapsed);
}
这可以称为:
ComputeTimings(() => Foo(bar), "Foo");
这很好,因为您可以将时间“注入”到您的代码中并根据需要将其删除,而无需更改您的实际方法主体。
另请注意,对于非常准确的计时,您通常需要至少执行该方法两次。方法第一次运行时,由于 JIT 编译器的原因,计时可能会关闭。如果您选择,您可以将其构建到上述方法中,即:
public static void ComputeTimings(Action method, string methodName, bool executeOnceFirst = true)
{
if (executeOnceFirst)
method();
var sw = Stopwatch.StartNew();
method();
sw.Stop();
Debug.WriteLine("Method {0} took {1}", methodName, sw.Elapsed);
}
于 2012-10-11T17:50:29.597 回答