Является ли вызов вызова fastcall действительно быстрее, чем другие соглашения о вызовах, такие как cdecl? Есть ли какие-то тесты, которые показывают, как влияет производительность на вызов?
Является ли fastcall действительно быстрее?
Ответ 1
Это зависит от платформы. Например, для Xenon PowerPC это может быть разбросом по порядку величины из-за проблемы с загрузкой-загрузкой с передачей данных в стеке. Я эмпирически подсчитал накладные расходы функции cdecl
примерно в 45 циклах по сравнению с ~ 4 для a fastcall
.
Для неуправляемого x86 (Intel и AMD) воздействие может быть намного меньше, потому что регистры все затенены и переименованы в любом случае.
Ответ на самом деле заключается в том, что вам нужно ориентироваться на конкретной платформе, о которой вы заботитесь.
Ответ 2
Является ли вызов вызова fastcall действительно быстрее, чем другие соглашения о вызовах, такие как cdecl?
Я считаю, что реализация Microsoft fastcall
на x86 и x64 включает в себя передачу первых двух параметров в регистры, а не в стек.
Так как он обычно сохраняет как минимум четыре обращения к памяти, да, это происходит быстрее. Однако, если задействованная функция является голодающей и, следовательно, вероятно, будет записывать их в локальные сети в стеке, то вряд ли это будет значительным увеличением.
Ответ 3
Соглашение о вызове (по крайней мере, на x86) действительно не имеет большого значения в скорости. В Windows _stdcall
был сделан по умолчанию, потому что он дает ощутимые результаты для нетривиальных программ, поскольку обычно это приводит к меньшему размеру кода по сравнению с _cdecl
. _fastcall
не является значением по умолчанию, потому что разница, которую он делает, намного менее осязаема. То, что вы компенсируете в аргументе, проходящем через регистры, которые вы теряете в менее эффективных функциях (как ранее упоминалось Anon.). Вы ничего не получаете, переходя в регистры, если вызываемая функция немедленно должна выплескивать все в память для своих собственных вычислений.
Тем не менее, мы можем использовать теоретические идеи весь день - сравниваем ваш код с правильным ответом. _fastcall
будет быстрее в некоторых случаях и медленнее в других.
Ответ 4
На современном x86 - нет. Между кешем L1 и встраиванием нет места для fastcall.