C# .NET秒表-性能惩罚
可能的重复项:C# .NET秒表-性能惩罚,c#,.net,stopwatch,C#,.net,Stopwatch,可能的重复项: 我有需要尽可能快地运行的代码。为了能够记录执行时间,我使用了类。我怀疑秒表可能会对演出产生不良影响。也许使用日期时间差可能更有效 你认为哪一个性能更好 Stopwatch sw = new Stopwatch(); sw.Start(); int a = 5; // Critical lines of code long elapsedMs = se.Elapsed.TotalMilliseconds; 或 我认为,就性能而言,第二种方法会更有效,正如评论中的链接所示,
我有需要尽可能快地运行的代码。为了能够记录执行时间,我使用了类。我怀疑秒表可能会对演出产生不良影响。也许使用日期时间差可能更有效 你认为哪一个性能更好
Stopwatch sw = new Stopwatch();
sw.Start();
int a = 5;
// Critical lines of code
long elapsedMs = se.Elapsed.TotalMilliseconds;
或
我认为,就性能而言,第二种方法会更有效,正如评论中的链接所示,如果您想测量秒以下的时间,那么DateTime将不准确,尽管它会更有效
我这样认为是因为StopWatch会连续测量滴答声,而DateTime只保存一个DateTime实例,即startTime。由于分析代码只执行一次,其性能影响应该可以忽略不计。只有在内部循环/关键代码路径中调用秒表时才会出现问题
GetTickCount()
应该是最快的评测方法之一,但它的精确度只有几毫秒。GetTickCount()
Windows API函数只检查一个简单变量(每隔几毫秒更新一次);它的成本是本机方法调用的成本,仅此而已。它以Environment.TickCount
的形式公开。但正如我所说,我怀疑这一点DateTime.UtcNow/Now
与GetTickCount
具有相同(低)的精度
从理论上讲,可能会对抖动产生一些影响,但这不太可能。我认为,如果你只调用几次,这并不重要,但是,一切都取决于你要求的准确度
Stopwatch
更精确,因为它依赖于QueuePerformanceCounter
API,所以它使用了更高的分辨率。Stopwatch
在调用Start
和Stop
之间没有做任何事情。。。启动时它只存储当前时间戳(通过QueryPerformanceCounter
),停止时将其与当前时间戳进行比较。因此,它没有理由会影响代码的性能,至少不会显著影响代码的性能Stopwatch
专为精确的时间测量而设计,因此您可以确保它经过了彻底优化。它也比比较DateTime的连续值精确得多 答案实际上取决于你想要达到的精度。对于大于秒的精度,秒表是一种更好的方法,因为它使用了比日期时间更精确的测量系统。
看
从性能的角度来看,我怀疑Start()和DateTime之间的差异有多大。现在存储来自相应测量系统的值,并在检索毫秒时计算差异并转换(根据需要)对于相应的测量单位。无关紧要的差异。如果您试图以所需的精度衡量性能,请参见DateTime
,这可能非常不准确。你也是;如果你的结果很重要,那么你可以把DateTime
排除在外。我不明白这怎么会是完全重复的。我怀疑它的声誉收集活动是为了标记重复的问题并关闭它们。这不是重复的其他问题。这个问题是关于通话的开销。其他问题只是关于返回信息的准确性。第一句正确的+1。获取当前日期时间只是从内存中读取计数器。但是,正如您所说,性能不是这里要考虑的正确指标,而是它的准确性。问题还在于秒表在Start()和Stop()调用中做什么,以及这对应用程序有何影响。VS2013 Performance Analyzer显示Stopwatch.Stop()浪费了大约0.92%(应用程序在每次查询之前执行80000个sql查询、1thread、sw.Start()/sw.Stop())我想要的解释。
DateTime startDate = DateTime.Now;
int a = 5;
// Critical lines of code
long elapsedMs = DateTime.Now.Subtract(startDate).TotalMilleseconds;