Vine al mismo problema así que hice algunas pruebas, aquí están algunos de los resultados obtenidos utilizando la versión de gcc 3.4.6/centos 4
CA y utilizará cc IFS, pero cc toma la variable de línea de comandos para el compilador no conoce el valor de "b" en el momento de la compilación. b.c utiliza cambiar
códigos fuente:
A.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;
}
}
primera compilamos los programas sin parámetros de optimización:
[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
Los resultados son como pensaba, el cambio es más rápido que si no se utiliza la optimización del compilador.
Ahora compilamos usando O2:
[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
Sorpresa sorpresa, ambos programas (A.C. y C.C) utilizando IFS son más rápidos que el interruptor (alrededor de 10 veces!).
Con 'if's, bajo ciertas circunstancias, el compilador puede optimizar el árbol' if' para usar una tabla de búsqueda. Esto es mucho menos probable, con los compiladores actuales, pero no va más allá de lo que dice el Estándar. –