Вопрос

Является ли вызововная связь 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top