Вы можете использовать встроенные ожидать с переключателем заявление


У меня есть оператор switch в некотором критическом по времени коде. Я пытался оптимизировать его с помощью __builtin_expect, но это, кажется, не работает. Мне интересно, может ли кто-нибудь сказать мне, если я упускаю какую-то деталь, или компилятор просто не оптимизирует для нее. Я попробовал следующее На моей хост-машине:

int main() {
    volatile int v=0;
    long i = 0;

    for (i=0; i<1000000000L; i++) {
            switch(__builtin_expect(v, EXPT)) {
            case 7:
                    v=7;
                    break;
            default:
                    v=7;
                    break;
            }
    }
    return v;
}

Затем я компилирую и запускаю следующим образом:

~/code/builtinexpect> gcc bie.c -o bie -D EXPT=0 && time ./bie 

real    0m2.092s  
user    0m2.086s
sys     0m0.000s
~/code/builtinexpect> gcc bie.c -o bie -D EXPT=7 && time ./bie 

real    0m2.092s
user    0m2.086s
sys     0m0.000s

Я использую GCC версии 4.5.1.

2 5

2 ответа:

GCC не поддерживает это ни на одной известной мне архитектуре. Если у вас есть высказывание switch, которое сильно благоприятствует конкретному случаю, лучше всего обратиться к высказыванию if ... else switch .... Это приведет к оптимизации, которую вы ищете.

Обе ветви case (и, следовательно, все случаи) делают одно и то же, поэтому компилятор может заменить весь оператор switch на v=7. Даже если это не так (без оптимизации), ожидаете ли вы какой-либо реальной разницы во времени?

но ближе к делу, __builtin_expect оценивает как (v == EXPT), либо (0), либо (1), поэтому case 7: никогда не будет принято.