и в первом случае с равной вероятностью при помощи ветвления выбирается вызов одной из них, во втором же случае у нас есть массив с указателями на функции, откуда вызываются функции по оффсету в виде выражения с такой же вероятностью, что из этого должно работать быстрее на x86/x64?
Не знаю. Я бы сделал явные вызовы без jump table.
А меня почему не спросил😕
Так а ты что думаешь по этому поводу?
Ниже написал. Есть свои нюансы. s54820 отказался от jump table, потому что, вроде как, на новых процессорах это внутри неплохо оптимизируется. Дело в том, что при использовании jump table, от процессора не требуется нагрузка на предсказатель ветвлений, а лишь вычислить адрес по формуле (ALU/AGU), однако при больших размерах, это всё требует большего размера программы, и соотв. требует некоторого нахождения в кэше, чтобы быстро обратиться к каждой ячейке массива указателей. В случае с ветвлениями, размер программы уменьшается, но идёт нагрузка на предсказатель ветвлений. Соотв., что я думаю.. Если, допустим, условий 10+ — естественно, гуманно использовать таблицу с указателями, если это возможно. Ну вы сами представьте себе такой код с ветвлениями, это же ужас для процессора будет. Если же условий 2-3, тогда зачем обращаться к памяти, вычислять адрес и т.д и т.п., если процессор вполне неплохо и сам может это оптимизировать (использовать ветвление).
Ну, а вообще, ответ s54820 не изменяется. Т.к функций в условии всего 2, тогда и использовать jump table не надо. Я просто хотел подробнее расписать свою точку))
Так а что же всё-таки дольше - пенальти от неудачного предсказания или же ожидание вычисления линейного адреса вызываемой функции (при условии, что она есть в кэше), имхо тут необходимо ещё рассматривать вероятности переходов.
Если функции всего 2, удачнее использовать обычное ветвление. На новых процессорах, всякие "пенальти" уже не так критичны будут, если они вообще ещё могут быть. Рассматриваются идеальные варианты, а не кривой код. На старых процессорах, уже всё меняется.
вычисление будет занимать не больше команды lea, а вот промах предсказателя может много
Так там не только вычисление, там ж зависимость загрузки инструкций функции от вычисления адреса, т.е. в конвейер не могут быть загружены инструкции пока не будет получен адрес (а это происходит примерно в середине конвейера), т.е. мы тоже получаем пенальти, собственно как и при колбек вызове. Я вот и хотел узнать соотношение пенальти ошибки предсказания и пенальти вычисления адреса.
Обсуждают сегодня