.NET计时器 - 性能惩罚

65

可能有重复:
使用DateTime.Now测量函数性能的最佳方法是什么?
计时事件 Stopwatch vs 使用System.DateTime.Now

我有需要尽可能快地运行的代码。为了记录执行时间,我使用Stopwatch类。我怀疑,使用 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
我非常怀疑使用任何一种方式都会得到相同的结果。差异微不足道。 - Only Bolivian Here
1
请参考以下链接:https://dev59.com/mnA85IYBdhLWcg3wJf8Z - ccellar
3
如果你想要用你所期望的那种精度来衡量性能,那么 DateTime 很可能非常不准确。因此,如果对你来说结果最重要,那么你可以排除 DateTime - vcsjones
7
我不明白这是如何成为完全相同的副本。我怀疑这是声誉积累行动的一部分,旨在将问题标记为重复并关闭它们。 - Rohit
8
这不是其他问题的重复,它涉及呼叫的开销,而其他问题仅涉及返回信息的准确性。 - Neville Cook
显示剩余3条评论
5个回答

95

StopwatchStartStop之间并不执行任何操作,它只是在你启动它时(通过QueryPerformanceCounter)存储当前时间戳,并在你停止它时将其与当前时间戳进行比较。因此,它不会对你的代码性能产生任何重大影响。 Stopwatch专门为准确的时间测量而设计,所以你可以确定它已经得到了彻底的优化。 它比比较连续的DateTime.Now值要准确得多...


10
这个问题涉及到Stopwatch在Start()和Stop()方法中的作用,以及这对应用程序的影响。VS2013性能分析器显示,Stopwatch.Stop()会浪费大约0.92%的时间(当应用程序执行80000个SQL查询,使用1个线程,在每个查询之前都调用sw.Start() / sw.Stop())。 - mistika
我正在寻找的解释。 - Neo

10

由于您的分析代码只会执行一次,所以它的性能影响应该可以忽略不计。只有当您在内部循环/关键代码路径中放置了对计时器的调用时,才会产生问题。

GetTickCount() 应该是最快的性能分析方法之一,但其精度只有几毫秒。 GetTickCount() Windows API 函数仅检查一个简单的变量(每隔几毫秒更新一次),其成本仅为本地方法调用的成本,没有更多附加成本。在.NET中,可通过 Environment.TickCount 访问。但正如我所说,我怀疑这并不重要。 DateTime.UtcNow/Now 的精度与 GetTickCount 相同(低精度)。

理论上,这可能会对JIT编译器产生一些影响,但这种可能性很小。


3
答案取决于您想要达到的精度。对于精度大于秒的情况,秒表是更好的选择,因为它使用比日期时间更精确的测量系统。 请参阅http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.aspx 从性能角度来看,我怀疑在获取毫秒时,Start()和DateTime.Now都会存储相应测量系统的值,并计算差异并转换(如所需)为相应的测量单位,因此两者之间并没有太大的区别。

2

我认为如果你只是偶尔调用它,那么这并不重要。不过,一切都取决于你需要的精度水平是什么; Stopwatch 更加准确,因为它依赖于 QueuePerformanceCounter API,所以使用更高的分辨率。


1

我认为第二个选项在性能方面会更有效率,正如评论中的链接所示,如果你想测量低于秒的时间,那么DateTime将不准确,尽管它是高效的。

我这样认为是因为StopWatch会持续地测量滴答声,而DateTime只会保留一个DateTime实例,即startTime。


获取当前日期时间只是从内存中读取计数器。然而,正如您所说,性能并不是在这里考虑的正确指标,准确性才是关键。 - nawfal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接