Производительность массива функций по операторам if и switch

Я пишу очень критичную для производительности часть кода, и у меня возникла безумная идея о замене операторов 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)?

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

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

15
задан OptimizingBastard 8 April 2011 в 11:48
поделиться