我们日常写代码时,经常自己去做一些优化,其实绝大多数情况都是没必要的,因为编译器比你想的聪明太多!
下面这个例子就是明证,
这个是一个求竭诚的递归写法,很多老手都会告诉你这样写性能低,应该用循环。
int rfact(int x)
{
int rval;
if(x<=1)
return 1;
rval=rfact(x-1);
return rval*x;
}
我想大家一般都不会有什么异议,那么来看看生成的代码是什么样子吧!
编译方法 gcc –O2 –S rfact.c
我只贴上关键的汇编代码,看看是不是毁三观!
_rfact:
movl 4(%esp), %edx
movl $1, %eax
cmpl $1, %edx
jg L3
jmp L2
.p2align 4,,7
L9:
movl %ecx, %edx
L3:
leal -1(%edx), %ecx
imull %edx, %eax
cmpl $1, %ecx
jne L9
L2:
rep ret
看到了吧,没有递归,没有递归,没有递归! 编译器帮你转换成循环了。 当然编译不能把所有的递归都转换成循环,但是可以看出大多数的优化真心没必要,只会带来错误, 比如使用右移来代替除法之类的,这些真心out了!
再给你看一个编译器优化的例子,比你想的聪明多了。
int choice3(int x)
{
return 15*x;
}
你觉得这里编译器会用乘法?那你错了!你错了!你错了!
_choice3:
movl 4(%esp), %edx
movl %edx, %eax
sall $4, %eax
subl %edx, %eax
ret
看到了么?乘以16-1,聪明吧。