移位指令比IMUL指令更快吗?

Kar*_*lee 11 optimization x86 assembly

哪一个更快 -

val = val*10;
Run Code Online (Sandbox Code Playgroud)

要么

val = (val<<3) + (val<<2);
Run Code Online (Sandbox Code Playgroud)

imul与移位指令相比,需要多少个时钟周期?

Dav*_*nan 62

这是21世纪.现代硬件和编译器知道如何生成高度优化的代码.使用shift来编写乘法将无助于提高性能,但它可以帮助您生成带有错误的代码.

您已经使用代码乘以12而不是10来证明了这一点.

  • +1"你已经用代码乘以12而不是10"来证明这一点.一个最好的答案! (19认同)

Hen*_*sma 10

我会说,只是写val = val * 10;或者val *= 10;,让编译器担心这些问题.

  • +1"我们应该忘记小的效率,大约97%的时间说:过早的优化是所有邪恶的根源" (4认同)
  • 特别是考虑到如果需要,编译器可以轻松完成这种优化(Warren在Hacker的喜悦中有一整章关于这些内容). (2认同)

nin*_*alj 8

在这种情况下,它们可能需要相同的循环次数,尽管您的手动"优化"需要一个以上的寄存器(这会减慢周围的代码):

val = val * 10;
lea    (%eax,%eax,4),%eax
add    %eax,%eax
Run Code Online (Sandbox Code Playgroud)

VS

val = (val<<3) + (val<<1);
lea    (%eax,%eax,1),%edx
lea    (%edx,%eax,8),%eax
Run Code Online (Sandbox Code Playgroud)

编译器知道如何减少力量,可能比你好得多.此外,当你自己的代码移植到其他平台(比如ARM),编译器知道如何做到这一点的平台上实力下降太(X86的LEA提供比ARM的不同优化机会ADDRSB).