Dav*_*ris 6 c c++ compiler-construction optimization performance
编译成更快的代码:"ans = n*3"或"ans = n +(n*2)"?
假设n是int或long,它是在现代Win32 Intel盒子上运行的.
如果涉及一些解除引用,这会有所不同,也就是说,哪些更快?
long a; long *pn; long ans; ... *pn = some_number; ans = *pn * 3;
要么
ans = *pn+(*pn*2);
或者,它是否需要不用担心,因为优化编译器在任何情况下都可能解释这一点?
Fer*_*cio 15
没关系.现代处理器可以在一个时钟周期或更短的时间内执行整数MUL指令,这与需要执行一系列移位并在内部添加以执行MUL的旧处理器不同,从而使用多个周期.我敢打赌
MUL EAX,3
Run Code Online (Sandbox Code Playgroud)
执行速度快于
MOV EBX,EAX
SHL EAX,1
ADD EAX,EBX
Run Code Online (Sandbox Code Playgroud)
这种优化可能有用的最后一个处理器可能是486.(是的,这偏向于英特尔处理器,但也可能代表其他架构).
无论如何,任何合理的编译器都应该能够生成最小/最快的代码.因此,首先要考虑可读性.
Ant*_*emi 10
由于自己很容易测量,为什么不这样做呢?(使用gcc
和time
来自cygwin)
/* test1.c */
int main()
{
int result = 0;
int times = 1000000000;
while (--times)
result = result * 3;
return result;
}
machine:~$ gcc -O2 test1.c -o test1
machine:~$ time ./test1.exe
real 0m0.673s
user 0m0.608s
sys 0m0.000s
Run Code Online (Sandbox Code Playgroud)
进行几次测试,然后重复另一种情况.
如果你想查看汇编代码, gcc -S -O2 test1.c