Подтвердить что ты не робот

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

Моя компания работает над большим проектом на 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. Мы также знаем, что разделение проекта на пакеты времени выполнения может сократить время компиляции. Но для развертывания и административных причин мы стараемся избегать использования пакетов времени выполнения.

4b9b3361

Ответ 1

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

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

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

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

Обновить:

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

Clear Unit Cache entry

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

Ответ 2

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

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

Ответ 3

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

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

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

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

Ответ 4

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

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

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

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

Ответ 5

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

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

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

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

Ответ 6

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