计算一个方法的执行时间

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

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

Stopwatch是专门为此目的而devise的,是在.NET中测量时间执行的最佳方法之一。

 var watch = System.Diagnostics.Stopwatch.StartNew(); // the code that you want to measure comes here watch.Stop(); var elapsedMs = watch.ElapsedMilliseconds; 

不要使用DateTimes来测量.NET中的时间执行。


更新:

正如在评论部分@ series0ne所指出的,如果你想真正精确地测量一些代码的执行情况,你将不得不使用内置在操作系统中的性能计数器。 following answer包含一个很好的概述。

从个人经验来看, 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毫秒,而其余的时间要less得多呢?”

答案是StopWatch不能补偿.NET中的“背景噪音”活动,如JITing。 因此,你第一次运行你的方法,.NET JIT的第一次。 执行此操作所需的时间会被添加到执行时间。 同样,其他因素也会导致执行时间的变化。

你应该真正在寻找绝对的准确性是性能分析

看看下面的内容:

RedGate ANTS性能分析器是一个商业产品,但产生非常准确的结果。 – 通过.NET分析提高应用程序的性能

这里是一个关于性能分析的StackOverflow文章: 什么是一些好的.NET分析器?

我也写了一篇关于使用秒表进行性能分析的文章,您可能需要查看一下.NET性能分析

StopWatch类寻找你最好的解决scheme。

 Stopwatch sw = Stopwatch.StartNew(); DoSomeWork(); sw.Stop(); Console.WriteLine("Time taken: {0}ms", sw.Elapsed.TotalMilliseconds); 

它也有一个名为Stopwatch.IsHighResolution的静态字段。 当然,这是一个硬件和操作系统的问题。

指示计时器是否基于高分辨率性能计数器。

如果你有兴趣了解性能,最好的答案是使用一个分析器。

否则, System.Diagnostics.StopWatch提供了一个高分辨率计时器。

StopWatch将使用高分辨率计数器

秒表通过计数基础定时器机制中的计时器滴答来测量已用时间。 如果安装的硬件和操作系统支持高分辨率性能计数器,则秒表类使用该计数器来测量已用时间。 否则,秒表类使用系统计时器来测量已用时间。 使用Frequency和IsHighResolution字段来确定秒表计时实施的精度和分辨率。

如果你在测量IO,那么你的数据可能会受到外部事件的影响,我会担心这么多。 正确性 (如上所述)。 相反,我会采取一系列的测量,并考虑这些数字的均值和分布。