Что следует обернуть макросами 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)))))
Я надеюсь, что это просто излишеством, потому что это в значительной степени нечитаемым.
Где вы планируете вводить этот код? На практике на современных процессорах x86 предсказатели отрасли намного лучше, чем статические подсказки, так или иначе, т. Е. Если вы достаточно часто запускаете код, и есть простой шаблон, который они легко подберут. Если вы * не выполняете код достаточно часто, почему вы думаете, что несколько циклов будут иметь большое значение? Теперь, если одна из ваших целевых платформ ARM, это, вероятно, не такая уж плохая идея. – Voo