计算方法的执行时间

< p > # EYZ0 < br / > # EYZ0 < / p >

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

639292 次浏览

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类寻找你的最佳解决方案。

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


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

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

定时器是否基于高分辨率性能 计数器。< / p >

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

秒表测量流逝的时间通过计数计时器滴答 底层计时器机制。如果硬件已安装并运行正常 系统支持高分辨率的性能计数器 Stopwatch类使用该计数器来测量经过的时间。否则, Stopwatch类使用系统计时器来测量经过的时间。使用 Frequency和IsHighResolution字段来确定精度 和秒表计时实现的分辨率

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

根据个人经验,System.Diagnostics.Stopwatch类可以用来测量方法的执行时间,但是,当心:它并不完全准确!

考虑下面的例子:

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

现在你在想;# EYZ0

答案是Stopwatch不能补偿。net中的“背景噪音”活动,比如JITing。因此,当你第一次运行你的方法时,. net会首先JIT它。这样做所花费的时间被添加到执行的时间中。同样,其他因素也会导致执行时间的变化。

你真正应该寻找的绝对精度是性能分析!

看看下面这些:

RedGate ANTS Performance Profiler是一个商业产品,但可以产生非常准确的结果。- # EYZ0

下面是StackOverflow的一篇关于概要分析的文章

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

 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);
}
}

遵循这个微软文档:

using System;
using System.Diagnostics;
using System.Threading;
class Program
{
static void Main(string[] args)
{
Stopwatch stopWatch = new Stopwatch();
stopWatch.Start();
Thread.Sleep(10000);
stopWatch.Stop();
// Get the elapsed time as a TimeSpan value.
TimeSpan ts = stopWatch.Elapsed;


// Format and display the TimeSpan value.
string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}",
ts.Hours, ts.Minutes, ts.Seconds,
ts.Milliseconds / 10);
Console.WriteLine("RunTime " + elapsedTime);
}
}
< p >输出: # EYZ0 < / p >

你也可以使用这个,"获取系统启动后经过的毫秒数。

System.Environment.TickCount

例如

static void method1()
{
for (int i = 1; i <= 100; i++)
{
Console.WriteLine("Test1 " + i);
}
}
static void Main(string[] args)
{
var startTime = Environment.TickCount;
method1();
var endTime = Environment.TickCount;
Console.WriteLine("RunTime " + (endTime - startTime));
}