Я столкнулся с той же проблемой, поэтому провел несколько тестов, вот некоторые результаты, полученные с использованием gcc версии 3.4.6 / centos 4
ac и cc, использующих ifs, но cc берет переменную из командной строкипоэтому компилятор не знает значение "b" во время компиляции.bc использует switch
исходные коды:
ac
#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;
}
}
bc
#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;
}
}
}
cc
#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;
}
}
сначала мыскомпилируйте программы без флагов оптимизации:
root@dev2 ~ # gcc a.c -o a;gcc b.c -o b;gcc c.c -o c
root@dev2 ~ # time ./a
real 0m4.871s
user 0m4.866s
sys 0m0.005s
root@dev2 ~ # time ./b
real 0m1.904s
user 0m1.904s
sys 0m0.000s
root@dev2 ~ # time ./c 10
real 0m4.848s
user 0m4.836s
sys 0m0.009s
Результаты, как я думал, переключаются быстрее, чем если бы не использовалась оптимизация компилятора.
Теперь мы компилируем, используя -O2:
root@dev2 ~ # gcc a.c -o a -O2;gcc b.c -o b -O2;gcc c.c -o c -O2
root@dev2 ~ # time ./a
real 0m0.055s
user 0m0.055s
sys 0m0.000s
root@dev2 ~ # time ./b
real 0m0.537s
user 0m0.535s
sys 0m0.001s
root@dev2 ~ # time ./c 10
real 0m0.056s
user 0m0.055s
sys 0m0.000s
Удивительно, но обе программы (ac и cc), использующие if, работают быстрее (примерно в 10 раз!), Чем switch.