Delphi: Как организовать исходный код для увеличения производительности компилятора? - PullRequest
32 голосов
/ 28 мая 2009

Я работаю над большим проектом Delphi 6 с довольно большим количеством зависимостей. Сборка всего проекта занимает несколько минут. Перекомпиляция после нескольких изменений иногда намного дольше, чтобы быстрее завершить работу Delphi, стереть все файлы dcu и перекомпилировать все.

Кто-нибудь знает способ определить, что делает компилятор все медленнее и медленнее? Любые советы, как организовать код для улучшения производительности компилятора?

Я уже пробовал следующие вещи:

  • Явно включите большинство единиц в dpr вместо того, чтобы полагаться на путь поиска: ничего не улучшилось.
  • Используйте компилятор командной строки dcc32: он не быстрее.
  • Попробуйте посмотреть, что делает компилятор (используя ProcessExplorer из SysInternals): по-видимому, он в большинстве случаев выполняет функцию с именем 'KibitzGetOverloads'. Но я ничего не могу сделать с этой информацией ...

РЕДАКТИРОВАТЬ, Резюме ответов до сих пор:

Ответ, который работал лучше всего в моем случае:

  • Функция «Очистить ссылки на неиспользуемые единицы» из cnpack . Он почти автоматически очищал более 1000 ссылок, делая «холодную» компиляцию примерно вдвое быстрее. («холодная» компиляция = стереть все dcu файлы перед компиляцией). Получает список ссылок от компилятора. Поэтому, если у вас есть {$ IFDEF}, проверьте, что все ваши конфигурации все еще компилируются.

Следующее, что я хотел бы попробовать:

  • Рефакторинг ссылок на единицы вручную (в конце концов, используя абстрактный класс) но это гораздо больше работы, так как мне сначала нужно определить, где проблемы. Некоторые инструменты, которые могут помочь:
    • GExperts добавляет браузер зависимостей проекта в Delphi IDE (но, к сожалению, он не может отображать размер каждой ветви)
    • Delphi Unit Dependency Viewer V1.0 делает то же самое, но без Delphi. Может вычислять простую статистику (на какие единицы больше всего ссылаются, ...)
    • Икар , на который ссылается ссылка в одном из ответов.

Вещи, которые ничего не изменили в моем случае:

  • Размещение всех файлов из моей программы и всех компонентов в одной папке без подпапок.
  • Дефрагментация диска (я пробовал с ramdisk)
  • Использование виртуального диска для папок с исходным кодом и выходными файлами.
  • Отключение антивируса сканирования в реальном времени
  • Перечисление всех модулей в файле dpr вместо использования пути поиска.
  • Использование компилятора командной строки dcc32 или ecc32.

Вещи, которые не относятся к моему делу:

  • Как избежать зависимости от общих сетевых ресурсов.
  • Использование DelphiSpeedUp , потому что оно у меня уже было.
  • Использование одной папки для всех dcu (я всегда так делаю)

Вещи, которые я не пробовал:

  • Обновление до другой версии Delphi.
  • Использование dcc32speed.exe
  • Использование твердотельного накопителя (я не пробовал, но я пытался с виртуальным диском, куда я помещал весь исходный код. Но, возможно, я должен был также установить delphi на виртуальный диск)

Ответы [ 17 ]

11 голосов
/ 28 мая 2009

Некоторые вещи, которые могут замедлить компилятор

  • Резервные единицы в вашем предложении uses. См. этот вопрос для ссылки на CnPack.
  • Не добавляет явно единицы в ваш файл проекта. Вы, кажется, уже это охватили.
  • Изменены настройки компилятора, прежде всего include TDD32 info.

Попытайтесь избавиться от неиспользуемых единиц в предложении использования и посмотрите, если это что-то меняет.

9 голосов
/ 28 мая 2009

с использованием Delphi 7 и 2009, на прошлой неделе я перешел с почти 2 минут на компиляцию и еще 45 секунд с нажатия f9 и получил основную форму моего приложения на 20 секунд на компиляцию и запуск. Эти вещи сводили меня с ума в течение приблизительно 6 месяцев, и ничто, что я попробовал, кажется, не работает. Используя filemon из SysInternals, я понимаю, что каждый модуль (в основном компоненты), который требуется компилятору, был найден в каждой папке, находящейся в пути поиска, да, это производит МНОГО FileOpen, FileExists и FileNotFound и т. Д. Что я делал, помещал каждый DCU, DFM, RES и т. Д. Из компонентов, которые находятся в одной папке и содержат только эту папку в пути поиска и несколько других папок, необходимых для проекта; результаты были потрясающими. Другой проблемой, предшествовавшей исправлению, была отладка. Во время отладки на каждой клавише F7, F8 требуется примерно 40 секунд, это также исправлено. Надеюсь, эта информация поможет вам. Привет из Исла де Маргарита, Венесуэла. Извините за мой английский, если есть ошибки;)

8 голосов
/ 28 мая 2009

Проверьте, есть ли в путях поиска пути, которых нет на вашем локальном компьютере.

т.е. Не связывайте двоичные файлы в общих сетевых ресурсах и убедитесь, что путь поиска не проверяет какие-либо общие сетевые ресурсы.

5 голосов
/ 28 мая 2009

Вы можете попробовать DelphiSpeedUp и посмотреть, что изменится. Он не ускоряет компиляцию командной строки, но утверждает, что имеет некоторые ускорения для компиляции IDE.

4 голосов
/ 28 мая 2009
  1. Вы установили одну папку для получения DCU. Если нет, они будут разбросаны повсюду.
  2. Поместите все модули и их неявно вызываемые модули (кроме установленных компонентов из пути к библиотеке) в dpr. Чтобы убедиться, что вы ничего не пропустили, очистите путь поиска, он все равно должен скомпилироваться.
  3. После сокращения пути поиска можно попытаться уменьшить путь к библиотеке, установив компоненты в меньшее количество папок.
4 голосов
/ 28 мая 2009

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

  1. Похоже, что в сообществе Delphi принято считать, что если вы не хотите обновляться до последней и самой лучшей версии (Delphi 2007 или 2009), то Delphi 7 - самая лучшая / самая быстрая / самая стабильная. Вы можете рассмотреть возможность обновления.
  2. KibitzGetOverloads звучит как что-то из компилятора kibitz - «фонового» компилятора, который дает вам завершение кода, подсветку фоновых ошибок, подсказки кода и т. Д. Похоже, вам лучше проверить стек вызовов команды- компилятор строки, а не IDE; Вы получите что-то более полезное.
  3. Я никогда не находил компиляции быстрее после удаления DCU. DCU призваны сделать построение инкрементным, а значит, более быстрым. Если после удаления всех DCU вы видите более быстрые компиляции, проверьте свое оборудование. Вы дефрагментировали свой жесткий диск в последнее время? Сколько свободного места у вас на диске?
3 голосов
/ 28 мая 2009

Хотя это отчасти относится к вашему конкретному вопросу, я слышал, что использование твердотельного накопителя значительно увеличивает время компиляции с Delphi - Ник Ходжес сказал это сам на подкасте Delphi пару недель назад. Brian

2 голосов
/ 30 мая 2009

См. это .

Я протестировал его на базе кода VCL.NET и работал .... Не знаю, остается ли он действительным для D2009, но он работает на D2006.net

2 голосов
/ 30 мая 2009

У меня была такая же проблема, и я могу найти (2) причины, по которым она меня затронула.

  1. Циркулярные ссылки. Джентльмен, который заявил, что это было правильно. У меня были бы некоторые БОЛЬШИЕ проекты, которые собирались бы быстро, и МАЛЫЕ проекты, которые собирались медленно. Не мог понять это, пока я не реструктурировал код, а затем я получил более высокие скорости компиляции. Много маленьких единиц. Легко строить монолитные блоки. Но есть много штрафов от этого.

  2. Я слышал это 1000 раз, развиваясь на медленной машине, которую могут использовать ваши пользователи. Эй, это для отдела тестирования. Я не могу тратить время на компиляцию, скорости загрузки Delphi, пакеты и т. Д. Я вышел и купил компьютер "GAMERS" (WOW) с твердотельными накопителями (как упоминалось ранее), 12 ГБ ОЗУ, разогнанный чип Intel i7 , тройные видеокарты (связанные), все на Vista64 (Vista не плохая, когда она наконец работает со всеми установленными частями). Это была настоящая боль, чтобы все это настроить. Но я больше не жду на своем компьютере. Чистая скорость компиляции, скорость загрузки, а также новая свежая машина без всего этого дерьма, которое было установлено на последнем за последние 2 года. Я даже разгрузил DelphiSpeedUp. Не нужно было это. И мне не нужно отключать Антивирус, так как я тоже это сделал и получил наказание за дерьмо в Интернете. Таким образом, Антивирус остается включенным. Чисто и просто, получи BALLS OUT машину. Ваше время стоит больше, чем вы потратите на новый компьютер.

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