关于c#:计算方法的执行时间

Calculate the execution time of a method

Possible Duplicate:
How do I measure how long a function is running?

我有一个将数据从一个位置复制到另一个位置的I/O计时方法。计算执行时间的最佳和最真实的方法是什么?EDOCX1?0?EDOCX1?1?EDOCX1?2?还有其他解决办法吗?我想要最精确、最简单的。


Stopwatch就是为此而设计的,是在.NET中测量时间执行的最佳方法之一。

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

不要使用datetime来度量.NET中的时间执行。

更新:

正如@series0ne在comments部分指出的那样:如果您想要对某些代码的执行进行真正精确的测量,则必须使用操作系统中内置的性能计数器。下面的答案包含了一个很好的概述。


从个人经验来看,System.Diagnostics.Stopwatch类可以用来测量一个方法的执行时间,但是要注意:它不是完全准确的!

请考虑以下示例:

1
2
3
4
5
6
7
8
9
10
Stopwatch sw;

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

sw.Stop();

实例结果

1
2
3
4
5
6
7
8
9
10
132ms
4ms
3ms
3ms
2ms
3ms
34ms
2ms
1ms
1ms

现在你在想,"为什么第一次要花132ms,而剩下的时间要少得多?"

答案是Stopwatch不能补偿.NET中的"背景噪声"活动,例如抖动。因此,第一次运行方法时,.net jit是第一个。这样做所需的时间将添加到执行时间中。同样,其他因素也会导致执行时间发生变化。

您真正需要的是绝对准确的性能分析!

请看以下内容:

Redgate Ants性能分析器是一种商业产品,但产生非常精确的结果。-通过.NET分析提高应用程序的性能

下面是一篇关于分析的stackoverflow文章:-什么是好的.NET分析程序?

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


Stopwatch类寻找您的最佳解决方案。

1
2
3
4
5
Stopwatch sw = Stopwatch.StartNew();
DoSomeWork();
sw.Stop();

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

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

Indicates whether the timer is based on a high-resolution performance
counter.


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

否则,system.diagnostics.stopwatch提供高分辨率计时器。


秒表将使用高分辨率计数器

The Stopwatch measures elapsed time by counting timer ticks in the
underlying timer mechanism. If the installed hardware and operating
system support a high-resolution performance counter, then the
Stopwatch class uses that counter to measure elapsed time. Otherwise,
the Stopwatch class uses the system timer to measure elapsed time. Use
the Frequency and IsHighResolution fields to determine the precision
and resolution of the Stopwatch timing implementation.

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


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 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);
   }
 }