2012-05-25 5 views
4

Что следует обернуть макросами gcc __builtin_expected в пределах if с несколькими и вложенными тестами? У меня есть этот код:рекомендации по использованию __builtin_expect

if((x<RADIUS && (forward?v<0:v>0)) || (x+RADIUS>dimensions[d] && (forward?v>0:v<0))) 

я (смешно), обернутый все, что мог:

#define likely(x)  __builtin_expect((x),1) 
#define unlikely(x)  __builtin_expect((x),0) 
if(unlikely(unlikely(unlikely(x<RADIUS) && likely(likely(forward)?likely(v<0):likely(v>0))) || unlikely(unlikely(x+RADIUS>dimensions[d]) && likely(likely(forward)?likely(v>0):likely(v<0))))) 

Я надеюсь, что это просто излишеством, потому что это в значительной степени нечитаемым.

+4

Где вы планируете вводить этот код? На практике на современных процессорах x86 предсказатели отрасли намного лучше, чем статические подсказки, так или иначе, т. Е. Если вы достаточно часто запускаете код, и есть простой шаблон, который они легко подберут. Если вы * не выполняете код достаточно часто, почему вы думаете, что несколько циклов будут иметь большое значение? Теперь, если одна из ваших целевых платформ ARM, это, вероятно, не такая уж плохая идея. – Voo

ответ

4

Я не думаю, что здесь есть неправильный ответ. Компилятор будет использовать ваши подсказки, чтобы решить, в каком случае сделать «else» случай каждого сравнения; это не только код C else, но и в пределах и и ors логики также, и чем больше информации, тем лучше.

Для удобства чтения кода я предлагаю хранить его в большом материале: один раз для каждого утверждения if, но это не основано на каких-либо твердых доказательствах.

Считаете ли вы использование -fprofile-generate, введите код с типичными данными, а затем перестройте с помощью -fprofile-use? Таким образом, компилятор может создать собственную картинку для всех этих случаев. Это более переносимо (без комментариев к компилятору), более читаемым и более перспективным.

Смежные вопросы