【问题标题】:Benchmarking code precisely精确地对代码进行基准测试
【发布时间】:2013-03-10 16:37:18
【问题描述】:

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

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

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

【问题讨论】:

  • 这听起来可能有点刻薄,但是:编写自己的操作系统,不能同时运行 200 个其他进程?严重的是,任何其他运行过程都会影响您的基准测试的结果。仅仅 1000 次运行,1% 的差异真的那么大吗? =)
  • 真的,不用担心非实时操作系统上的 1% 差异!

标签: c# .net benchmarking performance-testing


【解决方案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% 的变化一点也不奇怪。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 是否有其他进程正在运行?您可以将 CPU 内核的亲和性设置为 CPU0 以外的任何内容吗?当您说 1% 的差异时,从和到的时间是什么时候?异常值是罕见的还是时间结果相当分散(标准偏差)
    【解决方案3】:
    1. 在开始测量之前运行预热代码至少 10 秒。有必要确保 CPU 以最大速度运行。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-21
      • 2014-09-20
      • 1970-01-01
      • 2012-01-15
      • 1970-01-01
      • 2020-11-25
      • 1970-01-01
      • 2012-02-02
      相关资源
      最近更新 更多