如何在测量性能时减少循环开销?

How to reduce the overhead of loop when measuring the performance?

当我尝试衡量一段代码的性能时,我将其放入一个循环中并迭代一百万次。

for i: 1 -> 1000000
{
    "test code"
}

但是通过使用分析工具,我发现循环的开销很大,对性能结果的影响很大,尤其是当代码片段很小时,比如 1.5s 的总耗时为 0.5s循环开销。

所以我想知道是否有更好的方法来测试性能?或者我应该坚持这个方法,但是在同一个循环下制作多段相同的代码以增加其在性能上的权重?

for i: 1 -> 1000000
{
    "test code copy 1"
    "test code copy 2"
    "test code copy 3"
    "test code copy 4"
}

或者可以从总时间中减去循环开销吗?非常感谢!

您需要查看编译器生成的汇编列表。计算开销中的指令数。

通常,对于递增循环,开销包括:

  1. 递增循环计数器。
  2. 跳到循环顶部。
  3. 计数器与极限的比较。

在许多处理器上,这些都是一个或接近一个处理器指令。因此,找出一条指令退出的平均时间,乘以开销中的指令数,这就是一次迭代的开销时间。

例如,在平均每条指令 100ns 和 3 条指令开销的处理器上,每次迭代使用 3 * (100ns) 或每次迭代 300ns。给定 1.0E6 次迭代,3.0E08 纳秒将归因于开销。从您的测量值中减去该数量,以更准确地测量环路内容。