【问题标题】:.NET Stopwatch - performance penalty [duplicate].NET 秒表 - 性能损失 [重复]
【发布时间】:2011-08-08 17:36:23
【问题描述】:

可能的重复:
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;

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

// Critical lines of code

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

【问题讨论】:

  • 我高度怀疑使用任何一种都会产生相同的结果。无关紧要的差异。
  • DateTime 可能会非常不准确,如果您尝试以您想要的精度来衡量性能。所以对你来说;如果你的结果是重要的,那么你可以将DateTime排除在外。
  • 我不明白这是如何完全重复的。我怀疑它的声誉收集驱动器会将问题标记为重复并关闭它们。
  • 这不是其他问题的重复。这个问题是关于调用的开销。其他问题只是关于返回信息的准确性。

标签: c# .net stopwatch


【解决方案1】:

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

【讨论】:

  • 问题还在于 Stopwatch 在 Start() 和 Stop() 调用中做了什么以及它如何影响应用程序。 VS2013 Performance Analyzer显示Stopwatch.Stop()浪费了约0.92%(app做80000个sql查询,1thread,sw.Start()/sw.Stop()在每个之前)
  • 我正在寻找的解释。
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

        • +1 表示第一句话是正确的。获取当前 DateTime 只是从内存中读取一个计数器。但是,正如您所说,性能不是在这里考虑的正确指标,它的准确性。
        猜你喜欢
        • 2012-04-13
        • 2014-07-04
        • 1970-01-01
        • 1970-01-01
        • 2012-02-08
        • 1970-01-01
        • 2012-12-29
        • 2011-03-21
        • 1970-01-01
        相关资源
        最近更新 更多