0

我需要以尽可能高的精度来衡量我的代码的性能。

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

但是,基准运行之间仍然存在差异(最大约 1%)。任何想法如何使这种测量更精确?

4

3 回答 3

2

这可能很明显,但您的 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% 的变化一点也不奇怪。

于 2013-03-21T09:21:57.723 回答
0

是否有任何原因会导致性能不同,例如外部组件?

1% 的变化在性能上不会超过 1000 次运行,尤其是当它依赖于任何外部的东西时,例如与数据库或服务的连接。

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

于 2013-03-21T08:55:16.557 回答
0
  1. 在开始测量之前运行预热代码至少 10 秒。有必要确保 CPU 以最大速度运行。

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

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

于 2013-06-21T06:15:53.747 回答