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

Конечно, последняя версия не так удобна для чтения, но я ищу всю возможную скорость.

Я собираюсь сравнить это, когда у меня все настроено, но если у кого-то уже есть ответ, я не буду беспокоиться.

Ответы на вопрос(6)

Ваш ответ на вопрос