IT-Swarm.Net

计算方法的执行时间

可能重复: /
如何衡量功能运行的时间?

我有一个I/O计时方法,可以将数据从一个位置复制到另一个位置。什么是计算执行时间的最佳和最实际的方法? Threadname__? Timername__? Stopwatchname__?还有其他方法吗?我想要最精确的一个,尽可能简短。

453
Mahdi Tahsildari

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在评论部分所指出的:如果您想要对某些代码的执行进行真正精确的测量,则必须使用内置于操作系统中的性能计数器。 以下答案 包含一个很好的概述。

919
Darin Dimitrov

根据个人经验,System.Diagnostics.Stopwatch类可用于测量方法的执行时间,但是,BEWARE:这不完全准确!

考虑以下示例:

Stopwatch sw;

for(int index = 0; index < 10; index++)
{
    sw = Stopwatch.StartNew();
    DoSomething();
    Console.WriteLine(sw.ElapsedMilliseconds);
}

sw.Stop();

示例结果

132ms
4ms
3ms
3ms
2ms
3ms
34ms
2ms
1ms
1ms

现在你想知道; “为什么第一次需要132毫秒,其余时间显着减少?”

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

您应该真正寻求绝对准确性的是Performance Profiling

看看以下内容:

RedGate ANTS Performance Profiler是一种商业产品,但可以产生非常准确的结果。 - 使用.NET分析提升应用程序的性能

这是关于分析的StackOverflow文章: - 什么是一些好的.NET Profilers?

我还写了一篇关于使用秒表的性能分析的文章,你可能想看看 - .NET中的性能分析

62
series0ne

StopWatch class寻找最佳解决方案。

Stopwatch sw = Stopwatch.StartNew();
DoSomeWork();
sw.Stop();

Console.WriteLine("Time taken: {0}ms", sw.Elapsed.TotalMilliseconds);

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

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

24
Soner Gönül

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

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

17
Jeff Foster

StopWatch 将使用高分辨率计数器

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

如果您正在测量IO那么您的数据可能会受到外部事件的影响,我会非常担心。 exactness (如上所述)。相反,我会进行一系列测量,并考虑这些数字的平均值和分布。

7
Brian Agnew
 using System.Diagnostics;
 class Program
 {
    static void Test1()
    {
        for (int i = 1; i <= 100; i++)
        {
            Console.WriteLine("Test1 " + i);
        }
    }
  static void Main(string[] args)
    {

        Stopwatch sw = new Stopwatch();
        sw.Start();
        Test1();
        sw.Stop();
        Console.WriteLine("Time Taken-->{0}",sw.ElapsedMilliseconds);
   }
 }
0
RAKIBUZ SULTAN PRANTO

为此,我使用了Environment.TickCount属性。

int start = Environment.TickCount;
// Your code here...
int end = Environment.TickCount;
int diffInMilliseconds = end - start;
0
Srihari Sridharan