关于c#:. NET秒表 – 性能损失

.NET Stopwatch - performance penalty

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicates:
Is DateTime.Now the best way to measure a function's performance?
Stopwatch vs. using System.DateTime.Now for timing events

我有代码需要尽可能快地运行。为了能够记录执行时间,我使用了秒表类。我想,秒表可能会对表演造成不良影响。也许使用日期时间差异更有效?

你认为哪一个性能更好?

1
2
3
4
5
6
7
Stopwatch sw = new Stopwatch();
sw.Start();
int a = 5;

// Critical lines of code

long elapsedMs = se.Elapsed.TotalMilliseconds;

1
2
3
4
5
6
DateTime startDate = DateTime.Now;
int a = 5;

// Critical lines of code

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


Stopwatch在对StartStop的呼叫之间没有任何作用。它只在启动时存储当前时间戳(通过QueryPerformanceCounter),并在停止时将其与当前时间戳进行比较。因此,没有理由它会影响代码的性能,至少不会有太大的影响。Stopwatch是专门为精确的时间测量而设计的,因此您可以确保它是完全优化的。它也比比较DateTime.Now的连续值更准确。……


因为您的分析代码只执行一次,所以它的性能影响应该可以忽略不计。只有在内部循环/关键代码路径中调用秒表时才会出现问题。

GetTickCount()应该是最快的分析方法之一,但它的精度只有几毫秒。GetTickCount()windows api函数只检查一个简单变量(每隔几毫秒更新一次);它的开销是本机方法调用的开销,而不是更多。它在.NET中以Environment.TickCount的形式出现。但正如我所说,我怀疑这件事。DateTime.UtcNow/NowGetTickCount的精度相同(低)。

理论上,这种抖动可能会有一些影响,但这不太可能。


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

从性能的角度来看,我怀疑在查看start()和datetime的方式方面存在很大的差异。现在,存储来自相应测量系统的值,当检索毫秒数时,它计算出差异并将(根据需要)转换为相应的测量单位。


我不认为你只打几次电话真的很重要,但是,每件事都取决于你要求的准确程度;Stopwatch更准确,因为它依赖于QueuePerformanceCounterAPI,所以它使用更高的分辨率。


我认为就性能而言,第二个更有效,正如注释中的链接所指出的,如果您想测量秒以下的时间,那么日期时间将不准确,尽管它是有效的。

我认为是这样的,因为秒表将连续地测量计时周期,与只保存一个日期时间实例(即starttime)的datetime相比。