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来证明了这一点.
Hen*_*sma 10
我会说,只是写val = val * 10;
或者val *= 10;
,让编译器担心这些问题.
在这种情况下,它们可能需要相同的循环次数,尽管您的手动"优化"需要一个以上的寄存器(这会减慢周围的代码):
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的不同优化机会ADD
和RSB
).