Почему скорость компиляции Delphi ухудшается, чем дольше он открыт, и что я могу с этим поделать? - PullRequest
36 голосов
/ 05 июля 2011

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

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

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

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

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

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

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

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

Ответы [ 6 ]

23 голосов
/ 05 июля 2011

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

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

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

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

Обновление:

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

Clear Unit Cache entry

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

18 голосов
/ 05 июля 2011

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

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

7 голосов
/ 05 июля 2011

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

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

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

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

1 голос
/ 06 июля 2011

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

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

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

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

0 голосов
/ 05 июля 2011

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

0 голосов
/ 05 июля 2011

Вы пытались скомпилировать код, используя командную строку скрипта?

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...