我有一些代码会运行数千次,并且想知道什么更快.
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)如果您真的担心性能,可以使用值预先计算数组.
首先,在大多数体系结构中,错误分支是非常昂贵的(取决于执行管道深度),所以我敢打赌非分支版本更好.
代码的变体可能是:
result = array[29];
for (i=28; i>=0; i--)
result = result * 3 + array[i];
Run Code Online (Sandbox Code Playgroud)
只要确保没有溢出,所以result 必须是大于32位整数的类型.
即使加法比乘法更快,我认为你会因为分支而失去更多.在任何情况下,如果加法比乘法更快,更好的解决方案可能是使用表和索引.
const double table[3] = {0.0, 68630377364883.0, 68630377364883.0 * 2.0};
result += table[array[29]];
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3158 次 |
| 最近记录: |