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