n++ / ++n / n+=1 / n=n+1 实际效率比较
2009-06-13 18:05
169 查看
程序员面试宝典》上说n++高过n=n+1,貌似有道理。但效率不是你我说了算,而应该由编译器说了算。
测试源代码如下:
int main(void)
{
int n = 20;
n++;
++n;
n=n+1;
n+=1;
return 0;
}
VC++6.0的汇编代码如下:
9: int n = 10;
0040D781 mov dword ptr [ebp-1Ch],0Ah
10: ++n;
0040D788 mov ecx,dword ptr [ebp-1Ch]
0040D78B add ecx,1
0040D78E mov dword ptr [ebp-1Ch],ecx
11: n++;
0040D791 mov edx,dword ptr [ebp-1Ch]
0040D794 add edx,1
0040D797 mov dword ptr [ebp-1Ch],edx
12: n += 1;
0040D79A mov eax,dword ptr [ebp-1Ch]
0040D79D add eax,1
0040D7A0 mov dword ptr [ebp-1Ch],eax
13: n = n + 1;
0040D7A3 mov ecx,dword ptr [ebp-1Ch]
0040D7A6 add ecx,1
0040D7A9 mov dword ptr [ebp-1Ch],ecx
DEV-C++汇编代码如下:
movl $20, -4(%ebp)
leal -4(%ebp), %eax
incl (%eax)
leal -4(%ebp), %eax
incl (%eax)
leal -4(%ebp), %eax
incl (%eax)
leal -4(%ebp), %eax
现象:2个编译器对四条语句的汇编都是一样的,区别在于VC6用了3条汇编语句,而G++用了2条。
结论:
四条语句在某个具体的编译器环境中的实际效率是一样的,但不同的编译器实现又会有不同,如G++的效率,至少在这条语句的汇编上可以看出,比V6的高一点。
注:关于这个现象在《C专家编程》的P276页也有说明。
测试源代码如下:
int main(void)
{
int n = 20;
n++;
++n;
n=n+1;
n+=1;
return 0;
}
VC++6.0的汇编代码如下:
9: int n = 10;
0040D781 mov dword ptr [ebp-1Ch],0Ah
10: ++n;
0040D788 mov ecx,dword ptr [ebp-1Ch]
0040D78B add ecx,1
0040D78E mov dword ptr [ebp-1Ch],ecx
11: n++;
0040D791 mov edx,dword ptr [ebp-1Ch]
0040D794 add edx,1
0040D797 mov dword ptr [ebp-1Ch],edx
12: n += 1;
0040D79A mov eax,dword ptr [ebp-1Ch]
0040D79D add eax,1
0040D7A0 mov dword ptr [ebp-1Ch],eax
13: n = n + 1;
0040D7A3 mov ecx,dword ptr [ebp-1Ch]
0040D7A6 add ecx,1
0040D7A9 mov dword ptr [ebp-1Ch],ecx
DEV-C++汇编代码如下:
movl $20, -4(%ebp)
leal -4(%ebp), %eax
incl (%eax)
leal -4(%ebp), %eax
incl (%eax)
leal -4(%ebp), %eax
incl (%eax)
leal -4(%ebp), %eax
现象:2个编译器对四条语句的汇编都是一样的,区别在于VC6用了3条汇编语句,而G++用了2条。
结论:
四条语句在某个具体的编译器环境中的实际效率是一样的,但不同的编译器实现又会有不同,如G++的效率,至少在这条语句的汇编上可以看出,比V6的高一点。
注:关于这个现象在《C专家编程》的P276页也有说明。
相关文章推荐
- 一次C#和C++的实际应用性能比较(C++允许我们使用任何手段来提高效率,只要愿意做出足够的努力)
- Java从控制台读取数据,输入流System.in的几种方法效率比较
- 比较strtr, str_replace和preg_replace三个函数的效率
- for、foreach和MoveNext循环效率粗比较
- mysql exists 和 in的效率比较
- C#字符串分割效率比较
- 三种语言递归效率的比较matlab,python,c,lisp....
- SQL in与exists的执行效率比较
- 比较几种语言的Web开发效率
- 数组和链表插入效率比较
- ++前置,后置++ 汇编角度效率比较
- BitCount两种实现以及效率比较
- MFC目录遍历与BOOST效率比较
- 通过getPixel();和通过bmp.getPixels();方法遍历整张图片的效率比较。
- getChildByName()与getChildAt()效率比较
- java中StringBuilder清空效率比较
- sql语句or与union all的执行效率比较
- springMVC两种方式实现多文件上传及效率比较