我正在尝试优化一个小的、经常使用的函数,它使用 unsigned short int 中的高位来指示要加在一起的数组的值。起初我使用的是如下所示的明显方法。请注意,循环展开并未明确显示,因为它应该由编译器完成。
int total = 0;
for(unsigned short mask = 0x0001, j = 0; mask != 0; mask <<= 1, j++){
if (i & mask){
total += value[j];
}
}
但是,后来我认为删除分支以帮助 CPU 流水线可能会更好,并提出了以下建议。
int total = 0;
for(unsigned short mask = 0x0001, j = 0; mask != 0; mask <<= 1, j++){
total += ((i & mask) != 0) * value[j];
}
请注意,由于 (i & mask) 不会产生 bool 值答案,因此与 0 的比较会强制结果为 1 或 0。虽然第二种方法从这部分代码中删除了 if 语句,但除了等式的其余部分之外,第二个解决方案还需要在每次迭代中运行 0 或 1 的乘法。
哪个代码运行得更快?
最佳答案
Which code will run faster?
测试它以找出答案。
此外,查看编译器发出的代码的汇编语言版本,因为您可能会在其中看到令您惊讶的东西,并且暗示进一步优化(例如,使用 short
当您使用时可能需要更多指令,而不是使用机器的自然整数大小)。
关于c++ - 分支或乘法效率更高吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/514637/