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

31

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • Переход на другую версию Delphi.
  • Использование dcc32speed.exe
  • Использование твердотельного диска (я его не пробовал, но я попытался использовать ramdisk, где я поместил весь исходный код. Но, возможно, мне тоже нужно было установить delphi на ramdisk)
  • 1
    Что касается вашей проблемы $ IFDEF, вы должны заключить в себе использованные модули с соответствующими $ IFDEF, чтобы решить проблему CnPack, удалив их как неиспользуемые.
  • 0
    @Lieven: Хорошая идея заключить весь блок в соответствующий $ IFDEf. Но это не всегда возможно: если модуль является частью библиотеки, которую вы не хотите менять, вы обязаны поместить $ IFDEF в поле «Использование».
Теги:
optimization
compiler-construction

17 ответов

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

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

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

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

  • 1
    Спасибо за Ваш ответ. cnpack кажется интересным. Я попробую. Включить TDD32 уже деактивировано. Кстати, есть также компилятор под названием ecc32 (который вызывает dcc32), я не знаю точной разницы.
  • 1
    @ Имя, я этого не знал, извините за правку. Теперь вы упомянули об этом, есть также dcc32speed.exe. Он написан Андреасом Хаусладеном и исправляет несколько функций, чтобы ускорить компилятор.
Показать ещё 1 комментарий
9

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

  • 0
    Не очень практично, но стоит попробовать.
  • 0
    Я попробовал, это ничего не изменило в моем случае.
8

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

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

  • 0
    Ничего нет в сетевых ресурсах. Но хороший совет в любом случае.
5

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

  • 0
    У меня уже есть DelphiSpeedUp. Спасибо за совет в любом случае.
4
  • Установили ли вы одну папку для получения DCU. Если нет, они будут разбросаны по всему.
  • Поместите все блоки и их неявно называемые блоки (за исключением установленных компонентов из пути библиотеки) в dpr. Чтобы быть уверенным, что вы не пропустили никого, пустым поисковым путем, он все равно должен компилироваться.
  • После сокращения пути поиска вы можете попытаться уменьшить путь к библиотеке, установив компоненты в меньшее количество папок.
  • 0
    Я занимаюсь номером 1 систематически, но это может быть хорошим советом для людей, которые этого не делают. Я уже попробовал номер 2, как уже говорилось в моем первоначальном посте. Я не знаю, поможет ли номер 3, но это будет довольно много работы, так что это будет последний шаг, который я мог бы попробовать.
4

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

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

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

  • Циркулярные ссылки. Джентльмен, который заявил, что он был прав. У меня были бы определенные проекты LARGE, которые бы быстро компилировались, и SMALL-проекты, которые скомпилировались медленно. Не удалось понять, пока я не изменил код, а затем получил более быструю скорость компиляции. Много мелких единиц. Легко построить монолитные единицы. Но есть много штрафов.

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

  • 0
    Зачем останавливаться на 12 гигабайт, разве 32 не будет гораздо больше шаров? Не серьезно, не могли бы вы добавить какую-то информацию, почему кому-то понадобится эта смехотворная машина для разработки Delphi ?
  • 0
    Он спросил, как увеличить скорость компилятора. С каких пор SLI / Crossfire / Solid State диск увеличивает скорость компиляции Delphi? С каких это пор Delphi требует более 2 ГБ оперативной памяти?
Показать ещё 1 комментарий
3

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

  • 0
    Интересная идея, которая дала мне другую идею: я попытался поместить весь исходный код на виртуальный диск. Но я не получил никакого улучшения. Windows, вероятно, кеширует файлы достаточно хорошо.
2

См. this.

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

  • 0
    Он идет в том же направлении, что и ответ Нефтали, но с одним улучшением: предложение с абстрактным классом улучшить производительность. Спасибо за комплимент.
2

У нас была такая же (или аналогичная) проблема. У нашего пакета есть компиляция Время около 12 мин. После изменений, теперь мы переместились на 32 sg.

После многих тестов мы обнаружили, что "проблемная ситуация" была следующей: В одном пакете:

  • В Единице используется большое количество единиц: U1, U2, U3, U4,... U100 (использование интерфейса) в одном пакете. Это важный модуль, который централизует все операции инициализации.

  • Все блоки пакета U1, U2, U3,.., U100 используют блок A (использование реализации)

Эта "круговая ссылка" не дает ошибок компиляции, потому что USES отличаются друг от друга, но вызвали большой компилятор.

РЕШЕНИЕ: Устраните ссылку на каждый блок U1, U2, U3,...., U100 в A Unit.

Теперь Единица использует большое количество единиц: U1, U2,...., U100, но блоки U1, U2,..., U100 не используют устройство а.

После этого изменения время компиляции резко сокращается.

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

Извините за мой плохой английский.

Привет.


Нефтали-Герман Эстевес -

  • 0
    Интересное наблюдение. Я думаю, что у меня есть такой случай. Я постараюсь посмотреть.
  • 0
    Смотрите также ссылку, предоставленную Fabricio Araujo, которая идет в том же направлении: coding.derkeiler.com/Archive/Delphi/…
2
  • 0
    Я не знаю, где разделить исходный код в нужном месте, чтобы улучшить время компиляции в большинстве случаев, потому что я не знаю, что замедляет компилятор. Так что это может продолжаться долго, пока я действительно не получу хорошие результаты. +1 за совет про антивирус. Я не думал об этом до сих пор, стоит попробовать.
  • 1
    Третий пункт может быть смягчен, если AV допускает исключения пути, поэтому вы можете перечислить там <BDS> \ Lib; <Проект> \ DCU; <компоненты> и т. д. Так что это не будет тяжелым временем компиляции. Я знаю, что avast! есть эта опция на домашнем издании. Не знаю других
1

Так как у меня не было 50 очков репутации, я не могу ответить на сообщение BALLS OUT. Поэтому я должен начать новую позицию здесь. Я купил машину для работы с очень большими файлами Photoshop, и я также делаю много 3D-моделирования в Inventor и 3DStudio MAX. Вот почему я купил новую машину. НО... Я определенно получаю огромный толчок в использовании Delphi из-за этого. Моя зарплата стоит больше, чем дополнительные 2K, которые я потратил на новую машину, в отличие от покупки некоторых базовых Dell (что может быть хорошо для Delphi). Поэтому любой BOOST, который я могу получить, является БОНУСОМ. Если вы выполняете эту работу весь день, каждый день, как я, любая латентность, которую вы испытываете, начинает становиться реальной проблемой. Что он сделал для меня с использованием Photoshop, продуктов Autodesk и DELPHI. Поэтому я снова скажу, что новая машина BALLS OUT, улучшит вашу производительность. Парень спрашивал, что он может сделать, чтобы улучшить компиляцию производительности. Итак, я высказал свое мнение.

P.S. Поместите Delphi и ваш проект на твердотельный накопитель, и вы увидите увеличение скорости BIG.

1

Компилятор только скомпилирует измененные единицы. Если вы изменили код в разделе интерфейса, все единицы, которые зависят от измененного блока, скомпилированы. Если изменяется только код в разделе реализации, компиляция будет только этой единицей, но предположительно свяжет все модули. Представляет собой хороший дизайн интерфейсов спереди, но если вы реструктурируете код, чтобы ограничить изменения в времени компиляции, это может привести к сокращению. Понятия не имею. Этот факт упоминается в файлах справки Delphi в разделе "Множественные и непрямые ссылки" в Delphi 7 "Использование Delphi".

  • 0
    Я хотел бы изменить код для повышения скорости компиляции. Но я не знаю, с чего начать. Было бы неплохо иметь инструмент, который показывает, какие зависимости вызывают проблемы. Но такого инструмента, вероятно, не существует
1

Попробуйте установить диск ram и установите для него путь вывода dcu. Это более чем наполовину сократило время моей компиляции с Delphi 2007 поверх DelphiSpeedUp.

  • 0
    Я уже пробовал, чтобы после того, как Брайан Фрост сказал, что твердотельный накопитель, похоже, увеличивает производительность. В моем случае это ничего не изменило. Может быть, Windows уже хорошо справляется с кэшированием файлов.
0

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

Я использую Монитор процессов из Microsoft/SysInternals для мониторинга компилятора:

  • Я запускаю Process Monitor с фильтром, чтобы показать только dcc32.exe(или bds.exe при работе с IDE).
  • Я создаю свой проект из командной строки.
  • В конце я просматриваю операции CreateFile в журнале Process Monitor.

Для каждого устройства будет запись для файла .PAS(когда компилятор начнет работать на этом аппарате) и один для файла .DCU(когда компилятор будет сложным образом с этим устройством). Работая с журналом с текстовым редактором и/или с Excel, я могу извлечь такую ​​информацию:

  • Вид "дерева", где вы рекурсивно видите, в каком порядке компилируются единицы.
  • Для каждого устройства задержка между ".PAS файлом открыта" и ".DCU файл".

Затем я пытаюсь интерпретировать результаты, чтобы найти места, где выполнение некоторых рефакторингов ускоряет время компиляции. Это не так просто, но Im получает некоторые обнадеживающие результаты.

0

Что я делаю, всегда убедитесь, что в пути библиотеки очень мало каталогов, а большинство компонентов и статический код. Я также удостоверяюсь, что NO sourcecode доступен в пути к библиотеке, только .dcu/.res и т.д. Только browsepath имеет исходный код, а особые обстоятельства обрабатываются через путь поиска для проекта.

Просто ограничьте то, что вы скомпилируете в любой ситуации.

0
  • Не компилировать на сетевых дисках. Время поиска значительно ухудшается.
  • Обратите внимание на то, что ваш каталог dcu ( "unit output" ) находится в ramdrive.
  • Ограничьте количество каталогов include/unit.
  • Старайтесь избегать незначительных круговых ссылок, которые компилятор все еще принимает, особенно для больших единиц (например, сгенерированных единиц ORM для вашего OPF). Это может привести к тому, что большие единицы будут скомпилированы дважды. (делает ли Delphi небольшими взаимными циркулярами или является только функцией FPC?)

Я никогда не пробовал, но hardcoding все файлы с полным/относительным путем в центральном .dpr также могут помочь (script для регенерации/обновления?). (вы упомянули выше, но было ли это с помощью пути xx в нотации '\ path\yyy?).

Другие длинные снимки:

  • Использование Kylix (file/dir I/O под Linux значительно улучшилось в моем опыте (хотя это связано с опытом FPC)). Возможно, нам нужен обратный кросс-киликс: -)
  • Используйте отдельный (Windows) механизм сборки и настройте NTFS через реестр, чтобы быть менее "безопасным". (что вам неинтересно, поскольку для начала требуется вся система ревизии). Afaik эти параметры можно сделать только глобальными для всех файловых систем, следовательно, отдельной системой. Бросьте массив рейдов или Raptor тоже.
  • Забудьте о твердом состоянии. Хороший шум, но высокий коэффициент записи в конечном итоге убьет его (как жизнь, так и производительность, когда он станет более полным и не сможет оптимально распределить), и вам нужны дорогие интеллекты, чтобы выиграть два $75 HD в RAID.

P.s. Извините за ссылки FPC. Я делаю и то, и другое, и я иногда не знаю, что принадлежит чему.

  • 0
    "второстепенные циркуляры"? Поскольку я никогда не слышал об этом, я считаю, что это функция только для FPC.

Ещё вопросы

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