计算方法的执行时间

可能重复:
我如何衡量一个函数运行多久?

我有一个I / O时间占用方法,它将数据从一个位置复制到另一个位置。 计算执行时间的最好和最真实的方法是什么? ThreadTimerStopwatch ? 其他解决方案? 我想要最精确的一个,尽可能简短。


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

上一篇: Calculate the execution time of a method

下一篇: How can a make a sproc execute without a transaction?