c++ - 分支或乘法效率更高吗?

标签 c++ c optimization if-statement branch

我正在尝试优化一个小的、经常使用的函数,它使用 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/

相关文章:

c - 如何连接 GtkTreeVew 和 GtkListStore?

c - gcc gc-sections 选项删除 crtbegin/crtend 对象

java - 优化大容量日志文件的 Java 文件 I/O

algorithm - 如何优化以下算法?

C++ 错误 "not all control paths return a value"

c++ - 通过鼠标钩子(Hook)激活鼠标下的窗口

c - 使用X11(GTK,GDK)功能从C发送键组合

c++ - 多类型STL映射

c++ - 在opencv中连接 vector Rect

ruby - 优化 SVG 并创建 SVG sprite - ruby​​ middleman