Вопрос

Что происходит со встроенными функциями или процедурами в Delphi (в частности, здесь v2010, но у меня была такая же проблема с Turbo Delphi)?

В справке есть некоторый дискалимер по поводу того, что это не всегда может встроить функцию из-за "определенных критериев", что бы это ни значило.

Но я обнаружил, что обычно встраивание функций (даже очень простых, состоящих из 3 или 4 строк кода) скорее замедляет работу кода, чем ускоряет ее.

Отличной идеей была бы опция компилятора для "встроения всего".Меня не волнует, вырастет ли мой exe-файл примерно на 50%, чтобы заставить его работать быстрее.

Есть ли способ, которым я могу заставить Delphi действительно встроить код, даже если компилятор не решил, что он должен быть встроен?Это действительно помогло бы.В противном случае вам нужно выполнить "ручную встраивание" для репликации кода процедуры во многих областях вашего кода с замечаниями типа "//здесь не удалось выполнить встраивание, поэтому, если вы измените следующие 5 строк, измените их в остальных 8 дублирующихся местах, где этот код существует"

Есть здесь какие-нибудь советы?

Это было полезно?

Решение

Существует опция компилятора для автоматического встраивания коротких подпрограмм.В Параметрах проекта, в разделе Компилятор Delphi -> Компиляция -> Генерация кода, включите "Управление встраиванием кода" в Автоматическое.Однако имейте в виду, что это должно быть только в релизной сборке, поскольку встроенный код сложно отлаживать.

Кроме того, вы сказали, что не возражаете против увеличения размера вашей программы, если она становится быстрее, но часто встраивание делает ее медленнее.Вы должны знать, что это может быть связано.Чем больше ваш скомпилированный код, тем больше пропусков в кэше команд у вас будет, что замедляет выполнение.

Если вы действительно хотите ускорить свою программу, запустите ее через профилировщик.Я рекомендую Профилировщик выборки, который является бесплатным, создан для работы с кодом Delphi (включая 2010) и не замедляет ваше выполнение.Он покажет вам подробный отчет о том, на выполнение какого кода вы на самом деле тратите больше всего времени.Как только вы это обнаружите, вы можете сосредоточиться на узких местах и попытаться их оптимизировать.

Другие советы

В некоторых случаях вставка может замедлить работу. Встроенная функция может увеличить количество регистров ЦП, необходимых для локальных переменных. Если регистров недостаточно, доступные переменные будут расположены в памяти, что замедляет работу.

Если функция не встроена, у нее будут (почти) все доступные регистры ЦП.

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

Если вы хотите принудительно встроить , используйте подключаемые файлы. Необходимо убедиться, что вы объявляете правильные переменные, а затем используете {$ I filename.inc }. Это всегда вставит этот конкретный код туда, где вы хотите, и облегчит поддержку, если вам нужно его изменить.

Имейте в виду, что компилятор написан людьми умнее, чем большинство простых смертных (включая меня), и имеет доступ к дополнительной информации при принятии решения о включении или нет, поэтому, когда он не встроен, он, вероятно, имеет вескую причину.

Если я правильно понял один из этапов компиляции FPC (который имеет ту же проблему), встраивание может произойти только тогда, когда подпрограмма, которая должна быть встроена, уже скомпилирована.

IOW, если вы сделаете модуль с будущими встроенными функциями «листом» и поставьте его первым в предложении использования вашего проекта (.dpr), все должно быть в порядке. Обратите внимание, что с «листом» единица, я имею в виду единицу, которая не зависит от других единиц в проекте, т. е. только от уже скомпилированных единиц.

Я не удивлюсь, что в Delphi было то же самое, поскольку в нем используется единая система, основанная на тех же принципах.

Это также довольно легко исправить, не нарушая отдельные принципы компиляции.

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