【问题标题】:Performance gains from fast multiplication with bit shifting通过位移位的快速乘法提高性能
【发布时间】:2011-12-04 19:41:12
【问题描述】:

我最近阅读了很多关于编程实践、设计等方面的文章,并对将乘法实现为位移的真正性能提升感到好奇。

我正在阅读的示例是鼓励将 x*320 实现为 (x

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

有没有人不得不在他们的项目中以这种方式使用位移来实现更快的乘法?您可以期待哪些性能提升?

【问题讨论】:

  • 既然你问的是“你能期待什么样的性能提升?”,讨论这种事情真的会误导你,因为任何类型的微优化只在你可以编译的紧密的 CPU 循环,实际上有很多用处。这只是一个非常特殊的代码类别。人们编译的大多数应用程序几乎将所有时间都花在系统库、I/O、数据库访问等方面。它们可以被优化,但只能通过消除大部分时间在堆栈上的函数调用。编译器无法为您做到这一点。

标签: performance bit-manipulation bit-shift multiplication


【解决方案1】:

是的,编译器会为您完成大部分工作。他们也非常积极。所以很少需要自己做。 (尤其是以可读性为代价)

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

编辑:

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

【讨论】:

  • 很好的答案,一目了然。我只是好奇:这在最近几年有很大改善吗?我在我的问题中提到的那篇文章是 16 年前的一篇好文章,并且特别提到了 VS6。
  • 最近不太确定。只要我一直活跃(约 5 年),编译器就一直在做这种优化。但我可以想象这些“强度降低”优化比这要老得多。
  • 17-18 年前在 16 位汇编中使用过这个技巧。那时它快得多,不确定它与今天在 64 位 x86 上的 SSE 指令相比如何。
猜你喜欢
  • 1970-01-01
  • 2015-04-12
  • 1970-01-01
  • 2012-08-12
  • 1970-01-01
  • 2017-11-06
  • 1970-01-01
  • 2016-04-30
  • 1970-01-01
相关资源
最近更新 更多