.NET秒表 - 性能损失

时间:2011-08-08 17:36:23

标签: c# .net stopwatch

  

可能重复:
  Is DateTime.Now the best way to measure a function's performance?
  Stopwatch vs. using System.DateTime.Now for timing events

我的代码需要尽可能快地运行。为了能够记录执行时间,我使用Stopwatch类。我怀疑,秒表可能会以糟糕的方式影响表现。也许使用DateTime差异可能更有效?

您认为哪一个有更好的表现?

Stopwatch sw = new Stopwatch();
sw.Start();
int a = 5;

// Critical lines of code

long elapsedMs = se.Elapsed.TotalMilliseconds;

OR

DateTime startDate = DateTime.Now;
int a = 5;

// Critical lines of code

long elapsedMs = DateTime.Now.Subtract(startDate).TotalMilleseconds;

5 个答案:

答案 0 :(得分:66)

StopwatchStartStop的调用之间没有执行任何操作...它只会在您启动时存储当前时间戳(通过QueryPerformanceCounter) ,并将其与停止时的当前时间戳进行比较。所以没有理由它会影响代码的性能,至少不会显着。 Stopwatch专为精确时间测量而设计,因此您可以确保它经过全面优化。它比比较DateTime.Now的连续值更准确。 ...

答案 1 :(得分:9)

由于您的分析代码只执行一次,因此其性能影响应该可以忽略不计。如果你在内循环/关键代码路径中调用秒表,这只是一个问题。

GetTickCount()应该是最快的配置方式之一,但它只有几毫秒的准确度。 GetTickCount() Windows API函数只检查一个简单变量(每隔几毫秒更新一次);它的成本是本机方法调用的成本,仅此而已。它在.NET中以Environment.TickCount展示。但正如我所说,我怀疑这很重要。 DateTime.UtcNow/Now具有与GetTickCount相同(低)的准确度。

理论上,可能会对抖动产生一些影响,但这种情况不太可能。

答案 2 :(得分:2)

如果你只是几次打电话,我认为这不重要,但是,一切都取决于你所要求的准确度是多少; Stopwatch更加准确,因为它依赖于QueuePerformanceCounter API,因此它使用更高的分辨率。

答案 3 :(得分:2)

答案实际上取决于你想达到的精确度。对于精度大于秒的秒表,由于使用比日期时间更精确的测量系统,秒表是更好的方法。 见http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.aspx

从性能的角度来看,我怀疑看到Start()和DateTime.Now如何存储来自相应测量系统的值以及检索毫秒时计算差异并转换(如必要的)到相应的测量单位

答案 4 :(得分:1)

我认为就性能而言,第二个会更有效,并且正如评论中的链接所示,如果你想测量低于秒的时间,那么DateTime将不准确,尽管它会有效

我想是的,因为与DateTime相比,StopWatch会持续测量滴答,而DateTime只能容纳一个DateTime实例,即startTime。