计算方法的执行时间
可能重复:
我如何衡量一个函数运行多久?
我有一个I / O时间占用方法,它将数据从一个位置复制到另一个位置。 计算执行时间的最好和最真实的方法是什么? Thread
? Timer
? Stopwatch
? 其他解决方案? 我想要最精确的一个,尽可能简短。
Stopwatch
是为此目的而设计的,并且是在.NET中测量时间执行的最佳方法之一。
var watch = System.Diagnostics.Stopwatch.StartNew();
// the code that you want to measure comes here
watch.Stop();
var elapsedMs = watch.ElapsedMilliseconds;
不要使用DateTime来测量.NET中的时间执行。
更新:
正如评论部分的@ series0ne所指出的那样:如果您想对某些代码的执行进行真正精确的测量,则必须使用内置于操作系统中的性能计数器。 以下答案包含一个很好的概述。
从个人的经验, System.Diagnostics.Stopwatch
类可用于测量方法的执行时间,但要注意 :这是不完全准确!
考虑下面的例子:
Stopwatch sw = Stopwatch.StartNew();
for(int index = 0; index < 10; index++)
{
DoSomething();
Console.WriteLine(sw.ElapsedMilliseconds);
}
sw.Stop();
示例结果
132ms
4ms
3ms
3ms
2ms
3ms
34ms
2ms
1ms
1ms
现在你想知道; “那么为什么它第一次需要132毫秒,而其余时间要少得多呢?”
答案是, Stopwatch
不会补偿.NET中的“背景噪音”活动,如JITing。 因此,第一次运行你的方法时,.NET JIT就是第一次。 执行此操作所需的时间会被添加到执行时间。 同样,其他因素也会导致执行时间发生变化。
你应该真正在寻找绝对的准确性是性能分析 !
看看下面的内容:
RedGate ANTS Performance Profiler是一款商业产品,但产生非常准确的结果。 - 通过.NET分析提高应用程序的性能
这里是一个关于性能分析的StackOverflow文章: - 什么是一些好的.NET Profiler?
我还写了一篇关于使用秒表进行性能分析的文章,您可能需要查看 - .NET中的性能分析
StopWatch
类寻找最佳解决方案。
Stopwatch sw = Stopwatch.StartNew();
DoSomeWork();
sw.Stop();
Console.WriteLine("Time taken: {0}ms", sw.Elapsed.TotalMilliseconds);
它还有一个名为Stopwatch.IsHighResolution
的静态字段。 当然,这是一个硬件和操作系统问题。
指示计时器是否基于高分辨率性能计数器。
链接地址: http://www.djcxy.com/p/62245.html