64

可能的重复:
DateTime.Now 是衡量函数性能的最佳方法吗?
秒表与使用 System.DateTime.Now 进行计时事件

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

你觉得哪一个性能更好?

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

// Critical lines of code

long elapsedMs = se.Elapsed.TotalMilliseconds;

或者

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

// Critical lines of code

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

5 回答 5

93

在调用and ...Stopwatch之间没有做任何事情,它只是在您启动它时存储当前时间戳(通过),并在您停止它时将其与当前时间戳进行比较。所以没有理由它会影响你的代码的性能,至少不会显着。专为精确的时间测量而设计,因此您可以确信它已经过彻底优化。它也比比较 的连续值准确得多。...StartStopQueryPerformanceCounterStopwatchDateTime.Now

于 2011-08-08T17:49:52.303 回答
10

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

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

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

于 2011-08-08T17:41:44.620 回答
3

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

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

于 2011-08-08T17:50:32.997 回答
2

如果您只调用几次,我认为这并不重要,但是,一切都取决于您要求的准确性水平Stopwatch更准确,因为它依赖于QueuePerformanceCounterAPI,所以它使用更高的分辨率。

于 2011-08-08T17:42:56.900 回答
1

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

我认为是这样,因为与 DateTime 相比,StopWatch 将连续测量滴答声,后者仅保存一个 DateTime 实例,即 startTime。

于 2011-08-08T17:39:14.897 回答