2009-11-28 2 views
5

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

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

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

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

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

Все советы здесь?

ответ

11

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

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

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

+1

Код, установленный в автоматическом режиме, не помог. Пробоотборник пробоотборника отлично. Очень полезно показывать, где узкие места находятся в реальной статистике. Даже если это действительно показало мне, что я уже новичок. Это будет полезно в будущем. Спасибо. – TallGuy

3

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

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

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

+2

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

+3

Ларс +1 - за исключением того, что это не так редко. –

1

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

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

0

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

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

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

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