Почему скорость компиляции Delphi ухудшается, чем дольше он открыт, и что я могу с этим поделать?

34

Моя компания работает над большим проектом на Delphi уже более десяти лет. Наша кодовая база растет с годами и теперь насчитывает около 4 миллионов строк кода. Скорость компиляции становится проблемой. Мы потратили время, затрачивая единичные круговые ссылки (известная причина медленной компиляции) и изучали каждый аспект установки. Это доходит до того, что мы не сможем существенно улучшить его с помощью того, что мы можем контролировать.

В настоящий момент на современном ПК с 4 ядрами под управлением Windows XP SP3 и Delphi 2006, запустите Delphi и сделайте полную сборку, это займет ~ 40 секунд. Затем, если мы сделаем еще одну полную сборку в той же самой сессии Delphi, это займет 1 м 40 секунд. Повторите еще одну полную сборку, это будет еще хуже. Итак, и т.д.

(Мы хорошо знаем, что сама Windows кэширует файлы, и это сильно влияет на скорость компиляции. Вышеприведенные цифры основаны на том, что файлы кэшируются. Мы создали такой сценарий, получив Delphi для компиляции проекта один раз, завершая он, а затем запускает новую сессию Delphi, поэтому, хотя 40 секунд не выглядит медленным, это происходит только из-за того, что файлы кэшируются Windows. И мы делаем это, чтобы сравнить apple-to-apple.)

Что нас беспокоит, почему скорость компиляции ухудшается. (Мы наблюдали, что в прошлом замедление было хуже, если в проекте было много единичных круговых ссылок.) Если мы закончим Delphi и начнем новую сессию, время компиляции вернется к 40 секундам. Еще более интересная вещь, которую мы наблюдаем, заключается в том, что мы можем добиться "улучшения" с той же скоростью, нажав кнопку "Отмена", чтобы прервать компиляцию, а затем выполнить полную сборку сразу. Время компиляции также вернется к 40 секундам.

Нам кажется, что собственный кеш-память Delphi не зависит от сборки, но с течением времени ухудшается. И также появляется кнопка "Отмена", которая как-то очищает этот кеш. Мы думаем, что если мы сможем подключиться к подсистеме IDE Delphi, которая выполняет эту очистку, мы всегда можем поддерживать скорость компиляции с максимальной производительностью. Но мы не знаем, как.

Кто-нибудь знает, что мы можем сделать?

Мы по-прежнему используем Delphi 2006, поскольку мы еще не нашли способ переноса нашего большого проекта в Unicode. Я читал на форумах, что последний Delphi XE демонстрирует аналогичную скорость компиляции с единичной циклической ссылкой. Кто-нибудь знает, решила ли Delphi XE проблему?

p.s. Мы также знаем, что разделение проекта на пакеты времени выполнения может сократить время компиляции. Но для развертывания и административных причин мы стараемся избегать использования пакетов времени выполнения.

  • 3
    Вы исключили антивирусное программное обеспечение, программное обеспечение для индексирования и сторонних экспертов, работающих в IDE?
  • 8
    Вы рассматривали компилятор командной строки?
Показать ещё 11 комментариев
Теги:
performance
compilation

6 ответов

22
Лучший ответ

Если вы создаете приложение, вот несколько приемов для ускорения процесса:

  • Удалите все *.dcu перед сборкой (del *.dcu /s);
  • Запустите хороший дефрагментатор на вашем соответствующем жестком диске;
  • Поместите большую часть ваших исходных файлов в один и тот же каталог и попытайтесь как можно короче оставить пути библиотеки IDE и Project, с наиболее используемыми вначале элементами;
  • Установите DelphiSpeedUp.

Delphi 2007 должен компилироваться быстрее, чем Delphi 2006.

Delphi 2009/2010/XE, вероятно, будет медленнее: из пользовательского эксперимента реализация дженериков и нового RTTI сделала процесс компиляции более сложным, и фактическая реализация оказалась более медленной, например. чем с Delphi 2007.

Update:

Вы пытались включить запись скрытого меню ProjectClearUnitCacheItem?

Изображение 7772

У меня эта запись включена либо CnPack, либо DDevExtension (я не знаю, кто это делает, возможно позже). Это можно использовать для очистки внутреннего блока.

  • 0
    + за использование хорошего дефрагментатора
  • 1
    @ A.Bouchez Что такое кеш модуля и какие преимущества дает его очистка?
Показать ещё 5 комментариев
17

Постепенное снижение производительности может быть связано с утечкой памяти или другой ошибкой в ​​компиляторе. Небеса знают, что D2005 и D2006 их хватит! Если вы не можете перейти на версию Delphi с поддержкой Unicode, вы должны, по крайней мере, обновить D2007 (что, я считаю, все еще доступно для Embarcadero) для лучшей стабильности.

Кроме того, как отметил Роберт Фрэнк в комментарии, ознакомьтесь с инструментами Андреаса Хаусадена. Всего несколько дней назад он выпустил патч, который немного улучшил скорость компиляции. К сожалению, эта особенность, по-видимому, только для D2009 и более поздних версий, но многие его исправления помогают ускорить различные вещи, включая компилятор.

  • 0
    Я подозреваю, что это так. Я бы порекомендовал использовать Process Explorer из SysInternals, чтобы увидеть, увеличивается ли использование памяти bds.exe при каждой компиляции проекта. Это подтвердило бы теорию утечки памяти.
  • 0
    Больше похоже на «теорию заговора утечки памяти». Если у вас достаточно оперативной памяти, потребуется некоторое время, прежде чем IDE начнет переключаться на диск.
7

Хорошо стоит попробовать DelphiSpeedUp от Andreas Hausladen, но это поможет только производительности IDE, а не компиляции, как я ее понимаю.

Другая идея, которую никто еще не предложил, - использовать твердотельные диски высокой спецификации.

Я рекомендую использовать 64-битную Windows 7 с большим объемом оперативной памяти для лучшей производительности кэширования файлов.

Просто будьте благодарны, что ваш проект не написан на С++!

  • 1
    + для 64-битной Win7, потому что 4-ядерная система Windows XP, как упоминалось в OP, не является современной, не сегодня! Но я не очень уверен насчет этих высокопроизводительных твердотельных дисков: ОП говорит, что заставляет Windows кэшировать все файлы перед тем, как приступить к реальной сборке. Я не уверен, что лучше I / O ускорит процесс.
  • 0
    @cosmin комментарии кеширования в посте делают тесты более повторяемыми. Достойный ввод-вывод уменьшит эффект кэширования. 64-битная Win 7, скажем, 16 ГБ оперативной памяти приведет к большой файловый кеш тоже.
Показать ещё 6 комментариев
1

Подумайте о создании со встроенными пакетами времени, а затем создайте монолитные исполняемые файлы при отправке кода в отдел QA или распространяйте ваше приложение.

Это требует дополнительного обслуживания, но значительное увеличение времени сборки стоит того, чтобы ИМО.

У нас есть проект 2.4 MLOC с примерно 40-50 меньшими, поддерживающими приложениями. При компиляции с группой пакетов времени выполнения проект строится примерно на 500 тыс. Строк и строит примерно в 6 раз быстрее (15 секунд против 90 секунд). Многие из небольших приложений собираются за одну секунду или меньше, потому что большая часть упакованного кода является общей.

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

  • 0
    Мы рассмотрели то, что вы предложили. Но мы все еще не уверены, перевешивают ли накладные расходы и риски выгоду.
  • 0
    Это понятно, и я согласен. Особенно сложно поддерживать двойные компиляции. Конфигурации сборки очень помогают. Есть еще одно потенциальное преимущество, о котором я не упомянул ранее: поскольку пакеты не могут рекурсивно зависеть друг от друга, пакетные сборки обеспечивают хороший уровень программного обеспечения. Например, код низкого уровня не может быть статически связан с кодом более высокого уровня. Это само по себе является причиной, по крайней мере, для организации кода в пакеты времени выполнения.
0

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

0

Вы пытались скомпилировать код с помощью командной строки script?

Перекомпилировалась ли из командной строки процесс стоя на 40 секунд?

запустите из cmd "dcc32.exe", чтобы увидеть использование.

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

  • 0
    На практике я обнаружил, что компилятор командной строки работает медленнее, чем компилятор IDE, по крайней мере, в большинстве версий Delphi, если только вы не используете какой-то конкретный способ ускорения, такой как andy.jgknet.de/blog/ide-tools/dcc32speed-12
  • 1
    Мы используем командную строку для окончательной сборки для производственного развертывания. Да, это дает довольно стабильное время компиляции 40 секунд. Но не потеряете ли вы отладку в IDE? (Я не знаю, есть ли у нас взломы. Мне нужно уточнить у моего коллеги, чтобы узнать.)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню