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

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

41
задан Björn Lindqvist 19 August 2015 в 07:42
поделиться

4 ответа

Это зависит от платформы. Для Xenon PowerPC, например, это может быть разница на порядок величины из-за проблемы загрузки-попадания-хранилища с передачей данных в стек. Я эмпирически рассчитал накладные расходы функции cdecl примерно на 45 циклов по сравнению с ~ 4 для быстрого вызова .

Для вышедших из строя x86 (Intel и AMD) влияние может быть гораздо меньше, потому что все регистры затеняются и переименовываются в любом случае.

На самом деле ответ заключается в том, что вам нужно самостоятельно протестировать его на той конкретной платформе, которая вам интересна.

31
ответ дан 27 November 2019 в 00:41
поделиться

на современном x86 - нет. Между кэшем L1 и в футеровке нет места для FastCall.

10
ответ дан 27 November 2019 в 00:41
поделиться

Соглашение о вызовах (по крайней мере, на x86) не сильно влияет на скорость. В Windows _stdcall был сделан по умолчанию, потому что он дает ощутимые результаты для нетривиальных программ, поскольку обычно приводит к меньшему размеру кода по сравнению с _cdecl . _fastcall не является значением по умолчанию, потому что разница между ними гораздо менее ощутима. То, что вы компенсируете передачей аргументов через регистры, вы теряете в менее эффективных телах функций (как ранее упоминалось Аноном). Вы ничего не получите, передавая регистры, если вызываемой функции немедленно нужно вылить все в память для собственных вычислений.

Тем не менее, мы можем изливать теоретические идеи в течение всего дня - протестируйте свой код, чтобы получить правильный ответ. _fastcall будет быстрее в некоторых случаях и медленнее в других.

11
ответ дан 27 November 2019 в 00:41
поделиться

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

Я считаю, что реализация Microsofts fastcall на x86 и x64 включает передачу первых двух параметров в регистры, а не на стек.

Так как он обычно экономит как минимум четыре обращения к памяти, да, как правило, он работает быстрее. Однако, если задействованная функция испытывает нехватку регистров и, таким образом, вероятно, все равно будет записывать их в локальные объекты в стеке, значительного увеличения не произойдет.

17
ответ дан 27 November 2019 в 00:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: