Los que me conocen por aquí, saben que me gusta discutir por tonterias como estas(y que me gusta hacer posts largos)... hace poco estaba hablando sobre un tema con
mDrinky y discutíamos si el código compilado de if else es el mismo que switch o si switch era más rápido...
aquí mi prueba de concepto... switch es más rápido... muy ligeramente más rápido
leo un archivo (pi2.txt) y repito 100 veces con 1.000.000 de valores leidos, calculo promedio y repito por el otro metodo
#include <iostream>
#include <fstream>
#include <ctime>
using namespace std;
int ifelse_op(int largo, char memoria[]);
int switch_op(int largo, char memoria[]);
int main(){
int a = 0;//control de ciclos
int ciclos = 100;//cantidad de muestras
/*tiempos*/
float promedio = 0;
float max = 0;
float min = (unsigned int)-1;//maximo u_int
float buff = 0;
/*********/
/*pasamos el archivo a ram, cuidado con archios grandes*/
ifstream archivo ("pi2.txt",ios::ate);//abrimos con apuntador al final
int largo =(int) archivo.tellg();//calculamos el largo por el apuntador
archivo.seekg (0, ios::beg);//colocamos apuntador en el inicio
char memoria[largo];//char-s tan largo como archivo
archivo.read (memoria, largo);//botamos archivo completo a memoria
archivo.close();//listo con el archivo
/*primer metodo if-else*/
for(a=0;a<ciclos;a++){
buff = ifelse_op(largo,memoria);
promedio += buff;//suma para promedio
max = max>buff?max:buff;//si maximo es menor que buff max=buff
min = min<buff?min:buff;//si minimo es mayor que buff min=buff
}
promedio/=ciclos;//promedia
cout << "promedio if-else: " << promedio/CLOCKS_PER_SEC << "s" << endl;
cout << "min if-else:" << min/CLOCKS_PER_SEC << "s - ";
cout << "max if-else:" << max/CLOCKS_PER_SEC << "s" <<endl;
/*se reinician las variables*/
promedio = 0;
max = 0;
min = (unsigned int)-1;
/****************************/
/*segundo metodo switch*/
for(a=0;a<ciclos;a++){
buff = switch_op(largo,memoria);
promedio += buff;
max = max>buff?max:buff;
min = min<buff?min:buff;
}
promedio/=ciclos;
cout << "promedio if-else: " << promedio/CLOCKS_PER_SEC << "s" << endl;
cout << "min if-else:" << min/CLOCKS_PER_SEC << "s - ";
cout << "max if-else:" << max/CLOCKS_PER_SEC << "s" <<endl;
return 0;
}
/*****************************************/
int ifelse_op(int largo, char memoria[]){
clock_t inicio_reloj = clock();//tiempo inicial
int control;//variable para control
int i;//control de ciclos
for(i=0;i<largo;i++){
//char valor = memoria[i];//trampa a mi favor mwahaha!!
if(memoria[i]=='1') control = 1;
else if(memoria[i]=='2')control = 2;
else if(memoria[i]=='3')control = 3;
else if(memoria[i]=='4')control = 4;
else if(memoria[i]=='5')control = 5;
else if(memoria[i]=='6')control = 6;
else if(memoria[i]=='7')control = 7;
else if(memoria[i]=='8')control = 8;
else if(memoria[i]=='9')control = 9;
else if(memoria[i]=='0')control = 0;
else control = 0;
}
return clock() - inicio_reloj;//retorna tiempo
}
int switch_op(int largo, char memoria[]){
clock_t inicio_reloj = clock();//tiempo inicial
int control;//variable para control
int i;//control de ciclos
for(i=0;i<largo;i++){
//char valor = memoria[i];
switch (memoria[i]){
case '1':control = 1;
case '2':control = 2;
case '3':control = 3;
case '4':control = 4;
case '5':control = 5;
case '6':control = 6;
case '7':control = 7;
case '8':control = 8;
case '9':control = 9;
case '0':control = 0;
default: control = 0;
}
}
return clock() - inicio_reloj;//retorna tiempo
}
con mi perolita los resultados son
promedio if-else: 0.0238996s
min if-else:0.023581s - max if-else:0.024229s
promedio if-else: 0.0180653s
min if-else:0.018014s - max if-else:0.018394s
con ligeras variaciones menores a +-0.0007 dando como resultado un switch 8% más rápido que el if
si alguien cree que mi metodología o código esta mal o me equivoqué avisen
el archivo pi2.txt es un archivo que tengo por ahí tiempo y lo uso para probar cosas, es una generacion de pi a 1.000.000 de decimales, sin cabeceras, ni texto y medio mocho... son casi 1.1mb, si lo quieren, aqui está
https://mega.co.nz/#!6xAmGIaA!FtCMe4bM5NVm-gcO2zW-myUWlBdLI3TqlweAhKaQ-0IPD: codigo corregido...