Escribo una parte muy crítica del rendimiento del código y tuve esta loca idea de sustituir sentencias case (o sentencias if) con una matriz de punteros a función.Rendimiento de la matriz de funciones sobre las instrucciones if y switch
Déjenme demostrar; aquí va la versión normal:
while(statement)
{
/* 'option' changes on every iteration */
switch(option)
{
case 0: /* simple task */ break;
case 1: /* simple task */ break;
case 2: /* simple task */ break;
case 3: /* simple task */ break;
}
}
Y aquí está la versión "función de llamada":
void task0(void) {
/* simple task */
}
void task1(void) {
/* simple task */
}
void task2(void) {
/* simple task */
}
void task3(void) {
/* simple task */
}
void (*task[4]) (void);
task[0] = task0;
task[1] = task1;
task[2] = task2;
task[3] = task3;
while(statement)
{
/* 'option' changes on every iteration */
/* and now we call the function with 'case' number */
(*task[option])();
}
Así qué versión será más rápido? ¿La sobrecarga de la llamada de función elimina el beneficio de velocidad sobre la declaración de cambio normal (o si)?
Por supuesto, esta última versión no es tan legible, pero estoy buscando toda la velocidad que pueda obtener.
Estoy a punto de comparar esto cuando preparo las cosas, pero si alguien ya tiene una respuesta, no me molestaré.
Mi conjetura es el cambio será más rápido - no hay llamadas a funciones, menos errores de caché. Pero, pruébelo, porque como siempre * depende *. – Erik
No creo que sea de mucha (si la hay) diferencia. Dicho esto, ¿has intentado ejecutarlos para ver cuál es más rápido? – abeln
A menos que las funciones de su tarea sean __tiny__, unas pocas instrucciones de cualquier forma deberían hacer una diferencia insignificante. –