2010-02-02 3 views
38

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

+5

«Как влияет воздействие на конвенцию?» Незначительно. – avakar

+12

За исключением случаев, когда это серьезно. – Crashworks

+1

См. Также http://bcbjournal.org/articles/vol4/0004/When_to_use___fastcall.htm?PHPSESSID=7ea0b77df8671b0af9001fbca735c1bc – bluish

ответ

30

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

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

Ответ на самом деле заключается в том, что вам необходимо ориентироваться на конкретной платформе, о которой вы заботитесь.

16

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

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

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

+4

В x64 существует только одно соглашение о вызове –

10

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

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

8

На современном x86 - нет. Между кешем L1 и встроенной подкладкой нет места для fastcall.

+10

Если функция встроена, она не является ни fastcall, cdecl и других соглашений о вызове. – Crashworks

+7

Точно. Извлечение из L1 - это 1 цикл по регистру - в большинстве случаев он ниже уровня шума, его даже трудно проверить. И функции, в которых несколько циклов по вызову являются важным различием, должны быть в любом случае привязаны. – ima

+1

Я должен согласиться с этим - любая функция, которая достаточно проста для использования fastcall, выиграет от вложения еще больше. –

Смежные вопросы