.NET秒表-性能惩罚

本文关键字:惩罚 性能 秒表 NET | 更新日期: 2023-09-27 18:04:45

可能的重复:
是DateTime。现在测量函数的最佳方法';s的表现
秒表与使用System.DateTime.Now计时事件

我有一些代码需要尽可能快地运行。为了能够记录执行时间,我使用了Stopwatch类。我怀疑秒表可能会对演出产生不良影响。也许使用日期时间差可能更有效?

你认为哪一个表现更好?

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;

.NET秒表-性能惩罚

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

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

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

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

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

从性能的角度来看,我怀疑Start((和DateTime的差异有多大。现在存储来自相应测量系统的值,当检索毫秒时,它会计算差异并(根据需要(转换为相应的测量单位

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

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

我这么认为是因为与DateTime相比,StopWatch将持续测量刻度,DateTime将只保存DateTime的一个实例,即startTime。