我需要遍历摊销公式,如下所示:
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/