C++ - 什么会更快:乘法或加法?

nor*_*009 2 c++ optimization

我有一些代码会运行数千次,并且想知道什么更快. array是一个30值的短数组,总是保持0,1或2.

result = (array[29] * 68630377364883.0)
       + (array[28] * 22876792454961.0)
       + (array[27] * 7625597484987.0)
       + (array[26] * 2541865828329.0)
       + (array[25] * 847288609443.0)
       + (array[24] * 282429536481.0)
       + (array[23] * 94143178827.0)
       + (array[22] * 31381059609.0)
       + (array[21] * 10460353203.0)
       + (array[20] * 3486784401.0)
       + (array[19] * 1162261467)
       + (array[18] * 387420489)
       + (array[17] * 129140163)
       + (array[16] * 43046721)
       + (array[15] * 14348907)
       + (array[14] * 4782969)
       + (array[13] * 1594323)
       + (array[12] * 531441)
       + (array[11] * 177147)
       + (array[10] * 59049)
       + (array[9]  * 19683)
       + (array[8]  * 6561)
       + (array[7]  * 2187)
       + (array[6]  * 729)
       + (array[5]  * 243)
       + (array[4]  * 81)
       + (array[3]  * 27)
       + (array[2]  * 9)
       + (array[1]  * 3)
       + (b[0]);
Run Code Online (Sandbox Code Playgroud)

如果我使用类似的东西会更快吗?

if(array[29] != 0)
{
    if(array[29] == 1)
    {
        result += 68630377364883.0;
    }
    else
    {
        result += (whatever 68630377364883.0 * 2 is);
    }
}
Run Code Online (Sandbox Code Playgroud)

对于他们每个人.这会更快/更慢吗?如果是这样,多少钱?

Nul*_*ion 12

这是一个荒谬的过早"优化".您可能会因为在代码中添加分支而损害性能.错误预测的分支机构非常昂贵.它还使代码更难以阅读.

现代处理器中的乘法比以前快得多,现在可以完成几个时钟周期.

这是一个提高可读性的建议:

for (i=1; i<30; i++) {
    result += array[i] * pow(3, i);
}
result += b[0];
Run Code Online (Sandbox Code Playgroud)

pow(3, i)如果您真的担心性能,可以使用值预先计算数组.

  • 在可读性方面,我宁愿用原始代码中的`pow(3,N)`替换所有的倍数,让编译器优化它(-O1或更高,假定GCC). (3认同)

ysa*_*sap 8

首先,在大多数体系结构中,错误分支是非常昂贵的(取决于执行管道深度),所以我敢打赌非分支版本更好.

代码的变体可能是:

result = array[29];
for (i=28; i>=0; i--)
    result = result * 3 + array[i];
Run Code Online (Sandbox Code Playgroud)

只要确保没有溢出,所以result 必须是大于32位整数的类型.


jbe*_*das 5

即使加法比乘法更快,我认为你会因为分支而失去更多.在任何情况下,如果加法比乘法更快,更好的解决方案可能是使用表和索引.

const double table[3] = {0.0, 68630377364883.0, 68630377364883.0 * 2.0};
result += table[array[29]];
Run Code Online (Sandbox Code Playgroud)