Вы можете использовать встроенные ожидать с переключателем заявление
У меня есть оператор 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 ответа:
GCC не поддерживает это ни на одной известной мне архитектуре. Если у вас есть высказывание
switch
, которое сильно благоприятствует конкретному случаю, лучше всего обратиться к высказываниюif ... else switch ...
. Это приведет к оптимизации, которую вы ищете.
Обе ветви
case
(и, следовательно, все случаи) делают одно и то же, поэтому компилятор может заменить весь оператор switch наv=7
. Даже если это не так (без оптимизации), ожидаете ли вы какой-либо реальной разницы во времени?
но ближе к делу,__builtin_expect
оценивает как(v == EXPT)
, либо(0)
, либо(1)
, поэтомуcase 7:
никогда не будет принято.