准确地对代码进行基准测试

本文关键字:基准测试 代码 | 更新日期: 2023-09-27 18:05:09

我需要尽可能精确地度量代码的性能。

目前我正在使用:
-秒表测量计时
-设置进程亲和性以始终使用相同的CPU核心
—将线程优先级设置为最大值
-在测量
之前进行热身运行-运行测试1000次,计算平均值

然而,我仍然有基准运行之间的差异(大约1%最大)。有什么办法能让这个测量更精确吗?

准确地对代码进行基准测试

这可能是显而易见的,但是您的CPU并不是专用于单个进程的。它还负责操作系统和硬件的许多其他事情。

而且,内存使用情况、HDD使用情况和GC行为在执行期间可能会有所不同。也许您的计算需要虚拟内存,这比RAM访问要慢得多。等等…

关于GC,您可以尝试使用"GCSettings"的不同设置。LatencyMode",看看它是否改变了什么(例如,参见http://blogs.microsoft.co.il/blogs/sasha/archive/2008/08/10/low-latency-gc-in-net-3-5.aspx)。

在同一台计算机上的单个会话中,Stopwatch是相当准确的:如果执行之间的持续时间不同,可能不是因为测量缺乏准确性,而是因为过程本身并不总是花费相同的时间…显然,测试的每次"迭代"应该至少花费几百毫秒,Stopwatch将永远无法以纳秒为单位测量持续时间…

1%的差异并不奇怪。

是否存在导致性能不同的原因,例如外部组件?

1%的变化不会超过1000次运行的性能,特别是如果它依赖于任何外部的东西,比如连接到DB或服务。

秒表是测量时间最准确的方法,所以我不会担心这个

  1. 在开始我的测量之前运行预热代码至少10秒。有必要确保CPU以最高速度运行

  2. 测量最低运行时间,而不是平均值。

通过这两项改进,我已经获得了非常稳定的测量结果。