我來到了同樣的問題,所以我做了一些測試,這裏有一些結果使用gcc版本3.4.6/CentOS的4
AC和CC使用IFS獲得,但CC需要從命令行,以便變量編譯器在編譯時不知道「b」的值。 b.c使用切換
源代碼:
變交流
#include <stdint.h>
int main(){
uint32_t i,b=10,c;
for(i=0;i<1000000000;i++){
if(b==1) c=1;
if(b==2) c=1;
if(b==3) c=1;
if(b==4) c=1;
if(b==5) c=1;
if(b==6) c=1;
if(b==7) c=1;
}
}
b.c
#include <stdint.h>
int main(){
uint32_t i,b=10,c;
for(i=0;i<1000000000;i++){
switch(b){
case 1:
c=1;
break;
case 2:
c=1;
break;
case 3:
c=1;
break;
case 4:
c=1;
break;
case 5:
c=1;
break;
case 6:
c=1;
break;
case 7:
c=1;
break;
}
}
}
C.C
#include <stdint.h>
int main(int argc, char **argv){
uint32_t i,b=10,c;
b=atoi(argv[1]);
for(i=0;i<1000000000;i++){
if(b==1) c=1;
if(b==2) c=1;
if(b==3) c=1;
if(b==4) c=1;
if(b==5) c=1;
if(b==6) c=1;
if(b==7) c=1;
}
}
首先我們編譯的程序沒有優化標誌:
[email protected] ~ # gcc a.c -o a;gcc b.c -o b;gcc c.c -o c
[email protected] ~ # time ./a
real 0m4.871s
user 0m4.866s
sys 0m0.005s
[email protected] ~ # time ./b
real 0m1.904s
user 0m1.904s
sys 0m0.000s
[email protected] ~ # time ./c 10
real 0m4.848s
user 0m4.836s
sys 0m0.009s
結果如我所料,開關比沒有使用編譯器優化時更快。
現在我們編譯使用-02:
[email protected] ~ # gcc a.c -o a -O2;gcc b.c -o b -O2;gcc c.c -o c -O2
[email protected] ~ # time ./a
real 0m0.055s
user 0m0.055s
sys 0m0.000s
[email protected] ~ # time ./b
real 0m0.537s
user 0m0.535s
sys 0m0.001s
[email protected] ~ # time ./c 10
real 0m0.056s
user 0m0.055s
sys 0m0.000s
驚喜驚喜,採用IFS兩個程序(交流轉換器和C.C)快於開關(約10倍!)。
對於'if's,在某些情況下,編譯器可以優化'if'樹來使用查找表。對於目前的編譯器來說,這種情況的可能性要小得多,但並沒有超出標準所說的。 – 2010-07-30 17:33:26