c++ - 减少 for 循环开销

标签 c++ performance iteration

我需要遍历摊销公式,如下所示:

R = ( L * (r / m) ) / ( 1 - pow( (1 + (r / m)), (-1 * m * t ) );

我正在使用 for 循环进行迭代,每次将 L(贷款值)递增 1。循环工作得很好,但它确实让我想知道其他事情,这是在循环执行之前执行基本操作的值(value)(或缺乏值(value)),然后通过变量引用这些值。例如,我可以进一步修改此函数使其看起来像

// outside for loop
amortization = (r/m)/(1 - pow( (1+(r/m)), (-1*m*t) ) )

// inside for loop
R = L * amortization

这样,我就不必在循环的每次迭代中都执行大量数学运算,而只需引用变量 amount 并执行单个运算即可。

我想知道这有多重要?提取这些操作是否有任何实际值(value),或者节省的时间是否如此之少,以至于我们正在谈论从迭代约 0 次的 for 循环中节省的毫秒数。 20万次。跟进问题:如果我要执行像 sqrt 这样更昂贵的操作,像这样提取操作是否值得?

(注意:以防万一,我问这个问题时特别考虑了 c++)

最佳答案

编译器会在这里使用一种优化技术,称为循环不变代码移动。它几乎完成了您手动执行的操作,即将循环中重复评估的表达式的常量部分提取到存储在变量(或寄存器)中的预计算值中。因此,您自己执行此操作不太可能获得任何性能。

当然,如果速度很关键,您应该分析和/或检查编译器在这两种情况下生成的汇编代码。

关于c++ - 减少 for 循环开销,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6795927/

相关文章:

c++ - 力扣 65 : Valid Number (C++)

c++ - boost 串行器 : getting warning C4308 unless using virtual class destructor

c# - 如何在 C# 中存储静态数据列表?

php - 遍历对象数组

Python:如何将生成器迭代值附加到列表

c++ - Qt 线程计算输出到 GUI 中的自己的小部件?

javascript - John Resig 的 perf 函数

c# - 如何快速将 int 插入排序数组?

javascript 中的 php 计数器不起作用

c++ - 在哪里可以找到 C++ DNS 库?