Я пишу очень критичную для производительности часть кода, и у меня возникла безумная идея о замене операторов case (или операторов if) массивом указателей на функции.
Позвольте мне продемонстрировать; вот нормальная версия:
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;
}
}
А вот версия "функции обратного вызова":
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]) ();
}
Так какая версия будет быстрее? Устраняет ли накладные расходы на вызов функции преимущество в скорости по сравнению с обычным оператором switch (или if)?
Конечно, последняя версия не очень удобочитаема, но я ищу всю возможную скорость.
Я собираюсь протестировать это когда я все настраиваю, но если у кого-то уже есть ответ, я не буду беспокоиться.