Является ли FastCall действительно быстрее?
-
25-09-2019 - |
Вопрос
Является ли вызововная связь FastCall действительно быстрее, чем другие конвенции, такие как CDECL? Есть ли какие-либо тесты, которые показывают, как производительность зависит от конкуренции вызова?
Решение
Это зависит от платформы. Например, для Xenon PowerPC это может быть порядок разницы величины из-за проблемы с ударом нагрузки с передачи данных в стеке. Я эмпирически разоблачал над головой cdecl
функция примерно на 45 циклов по сравнению с ~ 4 для fastcall
.
Для вне заказа X86 (Intel и AMD) воздействие может быть намного меньше, поскольку регистры все в любом случае затенены и переименовываются.
Ответ действительно в том, что вам нужно решить это самостоятельно на конкретной платформе, которую вы заботитесь о.
Другие советы
Является ли вызововная связь FastCall действительно быстрее, чем другие конвенции, такие как CDECL?
Я считаю, что Microsofts реализация fastcall
На X86 и X64 включает в себя прохождение первых двух параметров в регистрах, а не на стеке.
Поскольку обычно это экономит как минимум четыре памяти, да, как правило, быстрее. Однако, если вовлеченность функций является реестр-голодной, и, возможно, может писать их в местных жителях в стеке в любом случае, вряд ли будет значительным увеличением.
Конвенция о вызове (по крайней мере, на X86) на самом деле не имеет большого значения разницы в скорости. В окнах, _stdcall
Был сделан по умолчанию, поскольку он создает ощутимые результаты для нетривиальных программ, в том, что он обычно приводит к меньшему размеру кода по сравнению с _cdecl
. _fastcall
не является значением по умолчанию, потому что разница, которую она делает, намного менее ощутима. То, что вы представляете в аргументе, проходящие через регистры, вы теряете менее эффективные функциональные тела (как ранее упомянутые Anon.). Вы ничего не получаете, передавая в регистры, если под названием функция немедленно необходимо пролить все в память для собственных расчетов.
Тем не менее, мы можем надевать теоретические идеи весь день - позорул ваш код для правильного ответа. _fastcall
будет быстрее в некоторых случаях и медленнее в других.
На современном х86 - нет. Между кэшем L1 и в футеровке нет места для FastCall.