通过位移位快速乘法提高性能

标签 performance bit-manipulation bit-shift multiplication

我最近阅读了很多有关编程实践、设计等的文章,并且对将乘法实现为位移位所带来的实际性能提升感到好奇。

我读到的示例鼓励将 x*320 实现为常用例程的 (x<<8 + x<<6)。

这在现代编译器中有多相关?如果有显着的性能提升,编译器是否可以根据需要自动将这些“简单乘法”转换为位移位?

是否有人在他们的项目中不得不采用这种方式进行位移来实现更快的乘法?您期望获得哪些性能提升?

最佳答案

是的,编译器会为您完成大部分工作。他们对此也非常有侵略性。所以很少需要自己做。 (特别是以可读性为代价)

但是,在现在的现代机器上,乘法并不比移位慢“那么”。因此,任何需要超过 2 次移位的数字最好使用乘法来完成。编译器知道这一点并会做出相应的选择。

编辑:

根据我的经验,我在这方面从来无法超越编译器,除非代码通过 SSE 内在函数进行矢量化(编译器并没有真正尝试优化)。

关于通过位移位快速乘法提高性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7718287/

相关文章:

r - 多处理两个数据帧之间的行匹配操作的最佳方式

c++ - 循环性能内部评估的 bool 条件

java - 我可以使用每次迭代移动 1 个新位的 for 循环来获取 Java 中的某个 8 位数字吗?

assembly - 无需 DIV 操作码即可在汇编中将任何数字(16 位)除以 3 的更快方法

java - Java中使用Bit Shift运算将十进制转换为十六进制

c# - 一种在开放委托(delegate)和封闭委托(delegate)之间执行转换的方法

SELECT 子句中的 MySQL 自定义函数非常慢

Java 在 AND'ing short 与 short 时,它升级为 int 并返回奇怪的值

python - 负数和正数之间的按位 AND (&)?

结合 uint8_t、uint16_t 和 uint8_t