Я прибыл на этот пост недавно, так как мне было интересно то же самое. Я нашел время, чтобы попробовать это. Это, конечно, сильно зависит от того, что вы делаете, но для моей виртуальной машины это было приличное ускорение (15-25%) и позволило мне упростить некоторый код (который, вероятно, и был причиной значительного ускорения). В качестве примера (код, упрощенный для ясности), цикл for был легко реализован с использованием цикла for:
у очень критичную для кода часть кода, и у меня возникла эта сумасшедшая идея о замене операторов 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)?
Конечно, последняя версия не так удобна для чтения, но я ищу всю возможную скорость.
Я собираюсь сравнить это, когда у меня все настроено, но если у кого-то уже есть ответ, я не буду беспокоиться.