>[оверквотинг удален]
> Базовый паттерн goto jump_table[*bytecode_ip++], соответственно out-of-order процессор
> может "узнать" адрес перехода еще до реального выполнения инструкций перед goto.
> Условных переходов тут нет (можно избавиться), поэтому предсказывать нечего.
> Если же инструкция байткода соответствует условному переходу, то вот тогда может участвовать
> предсказатель.
> И у всех современных ЦПУ он будет работать и верно предсказывать переходы
> в случае циклов в байткоде.
> Сложно возникают только если в байткоде есть цикл, а внутри него оператор
> if, которые реализуются через один опкод, но в актуальном коде работают
> в разных плечах.Да, те замеры проводились на байткоде, полученном вот из такого исходника:
let rec tailcall4 a b c d =
if a < 0
then b
else tailcall4 (a-1) (b+1) (c+2) (d+3)
По-моему, цикл с выходом по условию - достаточно частая конструкция.
> Тогда просто предсказатель начинает путаться, но штеудовский во многих случаях умеет подстраиваться
> (работает по принципу электронной гадалки).
То есть Интел хорошо работает не во всех случаях. Соответственно, когда это критично, интерпретаторы и/или исполняемую программу оптимизируют с учётом особенностей имеющегося процессора. Под Эльбрус собирают уже готовое, а не под него спроектированное. Возможно, это не решающий фактор, но наверняка играет роль. Если так, то получается, что имеющийся «бесплатный» открытый код отчасти представляет собой эдакий чемодан без ручки, реальная цена за него - это негатив к Эльбрусу.
> Как-то так.