以下测试是在vc6.0下进行的,主要有if、switch、for、while、do...while,下面依次分析:
1、if
20: if(x == 0)
00401078 cmp dword ptr [ebp+8],0
0040107C jne test_if+27h (00401087)
21: {
22: x =1;
0040107E mov dword ptr [ebp+8],1
23: }
24: else if(x > 0)
00401085 jmp test_if+3Dh (0040109d)
00401087 cmp dword ptr [ebp+8],0
0040108B jle test_if+36h (00401096)
25: {
26: x = 2;
0040108D mov dword ptr [ebp+8],2
27: }
28: else
00401094 jmp test_if+3Dh (0040109d)
29: {
30: x =3;
00401096 mov dword ptr [ebp+8],3
31: }
由上面可以看出,if转移语句较多,分词很多的情况下,效率就不及switch了
2、switch
67: switch(x)
68: {
004010D8 mov eax,dword ptr [ebp+8]
004010DB mov dword ptr [ebp-4],eax
004010DE cmp dword ptr [ebp-4],1
004010E2 je test_switch+2Ch (004010ec)
004010E4 cmp dword ptr [ebp-4],2
004010E8 je test_switch+33h (004010f3)
004010EA jmp test_switch+3Ch (004010fc)
69: case 1:
70: x = 2;
004010EC mov dword ptr [ebp+8],2
71: case 2:
72: x = 3;
004010F3 mov dword ptr [ebp+8],3
73: break;
004010FA jmp test_switch+45h (00401105)
74: default:
75: x--;
004010FC mov ecx,dword ptr [ebp+8]
004010FF sub ecx,1
00401102 mov dword ptr [ebp+8],ecx
76: }
可以看出,switch转移语句个数是有限的,和分支数目多少是无关的,因为switch的策略是转移表的,所以能用switch尽量不用if
3、for
83: for(i = 0 ;i <= x ;i++)
00401146 mov dword ptr [ebp-8],0
0040114D jmp test_for+38h (00401158)
0040114F mov eax,dword ptr [ebp-8]
00401152 add eax,1
00401155 mov dword ptr [ebp-8],eax
00401158 mov ecx,dword ptr [ebp-8]
0040115B cmp ecx,dword ptr [ebp+8]
0040115E jg test_for+4Bh (0040116b)
84: {
85: cnt++;
00401160 mov edx,dword ptr [ebp-4]
00401163 add edx,1
00401166 mov dword ptr [ebp-4],edx
86: }
00401169 jmp test_for+2Fh (0040114f)
87: }
4、while
91: while(x >= 0)
0040D5D8 cmp dword ptr [ebp+8],0
0040D5DC jl test_while+29h (0040d5e9)
92: {
93: x--;
0040D5DE mov eax,dword ptr [ebp+8]
0040D5E1 sub eax,1
0040D5E4 mov dword ptr [ebp+8],eax
94: }
0040D5E7 jmp test_while+18h (0040d5d8)
95: }
5、do while
99: do
100: {
101: x--;
0040D608 mov eax,dword ptr [ebp+8]
0040D60B sub eax,1
0040D60E mov dword ptr [ebp+8],eax
102: }while(x >= 0);
0040D611 cmp dword ptr [ebp+8],0
0040D615 jge test_do_while+18h (0040d608)
103: }
总结:流程控制语句if效率偏低,能采取代替策略尽量代替。而且while、do while效率偏高于for,能用while尽量不用for。