Встраивание Delphi 2010 бесполезно? - PullRequest
5 голосов
/ 28 ноября 2009

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

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

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

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

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

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

Ответы [ 4 ]

11 голосов
/ 28 ноября 2009

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

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

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

3 голосов
/ 28 ноября 2009

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

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

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

1 голос
/ 28 ноября 2009

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

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

0 голосов
/ 28 ноября 2009

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

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

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

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

...