Это частый вопрос для других компиляторов (C #, VC ++, GCC.) Я хотел бы узнать то же самое для компилятора Delphi (любой версии; в настоящее время я использую 2010 и XE2 и скоро буду использовать XE4).
У меня есть ситуация в высокопроизводительном коде, который я пишу, где нужно проверить условие, но в большинстве случаев никаких действий предпринимать не нужно:
if UnlikelyCondition then
HandleUnlikelyCondition
else
HandleLikelyCondition
end;
Часто ничего не нужно делать в вероятном случае:
if UnlikelyCondition then
HandleUnlikelyCondition
else
Exit
end;
Я хотел бы намекнуть компилятору, что вторая ветвь оператора if
- это та, для которой нужно оптимизировать. Как я могу это сделать в Delphi?
Текущий код
В настоящее время я написал свой код, предполагая, что условие if
, равное true, Лучшее для оптимизации:
if LikelyCondition then
HandleLikelyCondition
else
HandleUnlikelyCondition
end;
or
if LikelyCondition then Exit;
HandleUnlikelyCondition;
В тесте, только что использующем первый из этих двух примеров, я получаю повышение производительности на 50%, реструктурируя мои операторы if
, подобные этому, т. Е. Предполагая, что условие оператора if
равно true
. Возможно, вопрос можно сформулировать по-другому: это лучшее, что я могу сделать?
Если вы раньше не сталкивались с ошибочным предсказанием ветки, это эпический ответ - поучительное чтение.
__builtin_expect
(и аналогичные) не контролируют напрямую предсказатель ветвления (я не уверен, что это возможно на современном x86), они просто изменяют сгенерированный код в пользу вероятного пути, так что для этого требуется меньше инструкций. - person Oliver Charlesworth   schedule 06.07.2013then
и маловероятно - послеelse
(что в большинстве случаев в любом случае является хорошим стилем кода) - person OnTheFly   schedule 07.07.2013