我需要以尽可能高的精度来衡量我的代码的性能。
目前我正在使用:
- 秒表来测量时间
- 设置进程亲和性以始终使用相同的 CPU 内核
- 将线程优先级设置为最大值
- 在测量之前执行预热运行
- 运行测试 1000 次并计算平均值
但是,基准运行之间仍然存在差异(最大约 1%)。任何想法如何使这种测量更精确?
我需要以尽可能高的精度来衡量我的代码的性能。
目前我正在使用:
- 秒表来测量时间
- 设置进程亲和性以始终使用相同的 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例如)。
在同一台计算机上的单个会话中,秒表非常准确:如果执行之间的持续时间不同,这可能不是因为测量缺乏准确性,而是因为过程本身并不总是花费相同的时间......显然,测试的每次“迭代”至少需要几百毫秒,秒表永远无法以纳秒为单位测量持续时间......
1% 的变化一点也不奇怪。
是否有任何原因会导致性能不同,例如外部组件?
1% 的变化在性能上不会超过 1000 次运行,尤其是当它依赖于任何外部的东西时,例如与数据库或服务的连接。
秒表是测量时间最准确的方法,所以我不会担心
在开始测量之前运行预热代码至少 10 秒。有必要确保 CPU 以最大速度运行。
测量最低运行时间,而不是平均值。
通过这两项改进,我获得了非常稳定的测量结果。