Можно ли намекнуть, что конкретная ветвь оператора if, скорее всего, будет выполняться в компиляторе Delphi?

Это частый вопрос для других компиляторов (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. Возможно, вопрос можно сформулировать по-другому: это лучшее, что я могу сделать?

Если вы раньше не сталкивались с ошибочным предсказанием ветки, это эпический ответ - поучительное чтение.


person David    schedule 06.07.2013    source источник
comment
Обратите внимание, что речь не идет о предсказании ветвления (неправильного) ...   -  person Oliver Charlesworth    schedule 06.07.2013
comment
@OliCharlesworth Не могли бы вы объяснить?   -  person David    schedule 06.07.2013
comment
Насколько мне известно, GCC __builtin_expect (и аналогичные) не контролируют напрямую предсказатель ветвления (я не уверен, что это возможно на современном x86), они просто изменяют сгенерированный код в пользу вероятного пути, так что для этого требуется меньше инструкций.   -  person Oliver Charlesworth    schedule 06.07.2013
comment
Я не верю, что такое существует для компилятора Delphi.   -  person Nick Hodges    schedule 06.07.2013
comment
В настоящее время компиляторы Borland плохо справляются с оптимизацией :( Вероятный код ветки следует писать после then и маловероятно - после else (что в большинстве случаев в любом случае является хорошим стилем кода)   -  person OnTheFly    schedule 07.07.2013
comment
@ user539484: Не все из них - я считаю, что некоторые из них основаны на LLVM под капотом и действительно довольно хороши. К сожалению, стандартные компиляторы Win32 не были перенесены на эту новую архитектуру (пока, черт возьми).   -  person David    schedule 07.07.2013


Ответы (1)


Ни в языке, ни в компиляторе нет ничего, что позволяло бы давать подсказки для предсказания ветвлений. И в любом случае современные архитектуры игнорируют эти подсказки, даже если компилятор генерирует объектный код, содержащий подсказки.

person David Heffernan    schedule 06.07.2013
comment
Спасибо, Дэвид. Вы уверены, что современные архитектуры проигнорируют намеки? Другие вопросы о SO кажутся вполне уверенными в том, что подсказка дает преимущество - по крайней мере, подсказку компилятору, чтобы он мог оптимизировать код, чтобы внутреннее прогнозирование было более точным. И, можете ли вы сказать, что текущий код, который я использую, - лучший подход к его оптимизации? - person David; 06.07.2013
comment
В других вопросах этого не было. Они говорят, что P4 намекнул на коды операций перехода, но P4 игнорирует их. И современные предикторы ветвления или даже более сильные, без намека. - person David Heffernan; 06.07.2013
comment
Я имел в виду (этот вопрос) [stackoverflow. com / questions / 3702903 /, где "истинная" ветвь предполагает выполнение. Возможно, компилятор сможет реорганизовать код. Тем не менее, спасибо за ваш ответ (и @NickHodges тоже) - хорошо, что он подтвердился! - person David; 07.07.2013
comment
@David: обратите внимание, что подсказки ветвления времени компиляции на самом деле не превращаются в подсказки времени выполнения для предсказателя ветвления ЦП, они просто влияют на структуру функций и выбор безотходного (cmov) против ветвящегося. Как работают вероятные / маловероятные макросы в ядре Linux и в чем их преимущество? показан пример генерации кода. Невыбранные ответвления разрушают трубопровод меньше, чем взятые, даже если оба правильно спрогнозированы. - person Peter Cordes; 12.06.2021