Подтвердить что ты не робот

Является ли fastcall действительно быстрее?

Является ли вызов вызова fastcall действительно быстрее, чем другие соглашения о вызовах, такие как cdecl? Есть ли какие-то тесты, которые показывают, как влияет производительность на вызов?

4b9b3361

Ответ 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.