Является ли вызов вызова fastcall действительно быстрее, чем другие соглашения о вызовах, такие как cdecl? Есть ли там тесты, которые показывают, как влияет производительность на вызов?Является ли fastcall действительно быстрее?
ответ
Это зависит от платформы. Например, для Xenon PowerPC это может быть разбросом по порядку величины из-за проблемы с загрузкой-загрузкой с передачей данных в стеке. Я эмпирически подсчитал накладные расходы функции cdecl
примерно на 45 циклов по сравнению с ~ 4 для fastcall
.
Для нестандартного x86 (Intel и AMD) воздействие может быть намного меньше, потому что регистры все затенены и переименованы в любом случае.
Ответ на самом деле заключается в том, что вам необходимо ориентироваться на конкретной платформе, о которой вы заботитесь.
Является ли вызов вызова fastcall действительно быстрее, чем другие соглашения о вызовах, такие как cdecl?
Я считаю, что реализация Microsoft fastcall
на x86 и x64 включает в себя передачу первых двух параметров в регистры, а не в стек.
Поскольку он обычно экономит как минимум четыре обращения к памяти, да, это, как правило, быстрее. Однако, если задействованная функция является голодной, и, таким образом, она, вероятно, будет записывать их в локальные сети в стеке, вряд ли это будет значительным увеличением.
В x64 существует только одно соглашение о вызове –
Вызов условного обозначения (по крайней мере, на x86) на самом деле не имеет большого значения в скорости. В Windows _stdcall
был сделан по умолчанию, потому что он дает ощутимые результаты для нетривиальных программ, поскольку он обычно приводит к меньшему размеру кода по сравнению с _cdecl
. _fastcall
не является значением по умолчанию, потому что разница, которую он делает, намного менее осязаема. То, что вы компенсируете в аргументе, проходящем через регистры, которые вы теряете в менее эффективных функциях (как ранее упоминалось Anon.). Вы ничего не получаете, переходя в регистры, если вызываемая функция немедленно должна выплескивать все в память для собственных вычислений.
Однако мы можем использовать теоретические идеи в течение всего дня - сравниваем ваш код с правильным ответом. _fastcall
будет быстрее в некоторых случаях, а в других - медленнее.
На современном x86 - нет. Между кешем L1 и встроенной подкладкой нет места для fastcall.
Если функция встроена, она не является ни fastcall, cdecl и других соглашений о вызове. – Crashworks
Точно. Извлечение из L1 - это 1 цикл по регистру - в большинстве случаев он ниже уровня шума, его даже трудно проверить. И функции, в которых несколько циклов по вызову являются важным различием, должны быть в любом случае привязаны. – ima
Я должен согласиться с этим - любая функция, которая достаточно проста для использования fastcall, выиграет от вложения еще больше. –
- 1. Является ли BlueStacks действительно эмулятором?
- 2. Является ли компиляция кода действительно быстрее, чем интерпретация кода?
- 3. Является ли физическое моделирование действительно быстрее на GPU?
- 4. Является ли использование java-сервиса действительно быстрее, чем обслуживание потока?
- 5. Действительно ли SQLite работает быстрее MySQL?
- 6. Являются ли петли действительно быстрее рекурсии?
- 7. Действительно ли действующие веб-страницы загружаются быстрее?
- 8. Является ли `extend` быстрее, чем` + = `?
- 9. Является ли HTMLPurifier действительно пуленепробиваемым?
- 10. Является ли счет (*) действительно дорогим?
- 11. Является ли Backbone.js действительно MVC?
- 12. Является ли __del__ действительно деструктором?
- 13. Является ли функция действительно объектом
- 14. Является ли window.navigator.userAgent действительно устаревшим?
- 15. Является ли WebClient.DownloadFileAsync действительно медленным?
- 16. Действительно ли fetch_sub является атомарным?
- 17. Является ли SVG действительно масштабируемым :)?
- 18. Является ли JavaEE действительно портативным?
- 19. Является ли мыло действительно совместимым?
- 20. Является ли file_get_contents быстрее, чем iframe
- 21. Является ли CSS быстрее, когда вы конкретны?
- 22. Является ли отраслевое расхождение действительно настолько плохим?
- 23. Безопасно ли использовать fastcall в общей библиотеке?
- 24. Fastcall GCC пример
- 25. Является ли `scipy.misc.comb` быстрее, чем однобитовое вычисление?
- 26. ли Array.pop() в цикле действительно 50x быстрее, чем Array.length =
- 27. Действительно ли список соединяется быстрее, чем конкатенация строк в python?
- 28. Компоненты действительно быстрее по сравнению с шаблонами?
- 29. Является ли безопасность объекта как диктатора действительно действительно гарантированным стандартом?
- 30. Параметры отправки отправки - fastcall
«Как влияет воздействие на конвенцию?» Незначительно. – avakar
За исключением случаев, когда это серьезно. – Crashworks
См. Также http://bcbjournal.org/articles/vol4/0004/When_to_use___fastcall.htm?PHPSESSID=7ea0b77df8671b0af9001fbca735c1bc – bluish