среда, 29 сентября 2010 г.

Время запуска Delphi и кухня конфигураций

Это перевод Delphi Startup Times and the Kitchen Sink. Автор: Mark Edington.

Прим.пер.: время загрузки среды не является проблемой, начиная с Delphi 2009 (и даже Delphi 2007 часто показывает отличные результаты), но этот материал будет полезен не только при оптимизации запуска, но и для организации нескольких рабочих конфигураций среды.
Шаблонное предупреждение о редактировании реестра: в этой статье проповедуется редактирование системного реестра (о, нет, только не это!). Если это то, от чего вы брезгливо отворачиваетесь, то эта статья, вероятно, не для вас. Если же вы решили идти вперед с любой из процедур, которые я предлагаю ниже, то учтите, что вы делаете это на свой страх и риск. Если что-то пойдет не так, вы можете винить меня, если вам станет от этого легче.
Borland Developer Studio 2006 является тем, что я бы квалифицировал как весьма "существенная" часть программного обеспечения. Она поставляется на четырех компакт-дисках и включает в себя много дополнительных приложений в дополнение к основной среде разработки (далее именуемой "IDE"). Основная программа установки для версии Architect устанавливает также более 20'000 файлов - и это не считая файлов, устанавливаемых с companion-дисков!

Для реализации всех характеристик и функциональности IDE требуется загрузить значительное количество модулей (в основном DLL и сборок .NET). В зависимости от версии продукта и установленных компонентов, при загрузке легко может загружаться более 400 различных модулей во время запуска среды. Они включают в себя такие вещи, как файлы пакетов, которые предоставляют функции IDE, пакеты компонентов, которые обеспечивают работу компонентов для создания приложений в IDE, системные файлы, типа kernel32.dll, файлы фреймворка .NET, и многие, многие другие типы модулей.

Как вы можете себе представить, загрузка всех этих модулей и выполнение их кода инициализации занимает кучу времени. Повезло тем, у кого есть невероятно быстрое аппаратное обеспечение, например двухъядерный процессор с RAID массивом SSD дисков и несколько гигабайт оперативной памяти - они, возможно, не задумываются над временем запуска IDE, но большинство пользователей с более скромным аппаратным обеспечением, вероятно, не будет возражать, если время запуска среды немного уменьшится.

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

Закапываемся в новый ключ командной строки BDS.EXE: –p

Если вы установили все personality IDE, то вы увидите, что у вас есть несколько ярлыков для запуска IDE в папке Borland Developer Studio меню Пуск. Один ярлык запускает IDE со всеми доступными personality, другой запускает только personality Delphi Win32, а третий - только CSharp, и так далее. Если вы посмотрите на свойства ярлыков, то увидите, что те, которые запускают единственную personality, содержат переключатель командной строки –p. Это новый ключ, введённый в Delphi 2006, чтобы позволить пользователям выборочно загружать пакеты IDE. При этом вы получаете эффект уменьшения времени загрузки IDE, ограничивая набор пакетов для загрузки. Например, только Delphi personality загрузится намного быстрее, чем все доступные personalitiy.

Чтобы понять, что делает ключ –p, вам нужно запустить редактор реестра Windows (regedit.exe) и открыть этот ключ реестра:

HKEY_CURRENT_USER\Software\Borland\BDS\4.0\Known IDE Packages

Прямо под этим ключом вы увидите набор строковых значений для различных пакетов IDE. Например:

$(BDS)\Bin\asmview100.bpl

$(BDS)\Bin\Borland.Caliber.IDE100.bpl

В этом ключе также есть несколько под-ключей (вы можете увидеть их, развернув элемент дерева "Known IDE Packages" слева). В BDS 2006 эти под-ключи могут быть: CBuilder, CSharp, Delphi, DelphiDotNet и VB. Каждый из этих под-ключей соответствует конкретной personality IDE. Если вы вернётесь и снова посмотрите на свойства ярлыков в меню Пуск, то вы увидите, что каждый ярлык указывает также подстроку, указывающую, какой набор пакетов грузить. Например, если вы запустите BDS.EXE, используя командную строчку –pDelphi - то среда загрузит все пакеты, перечисленные в ключе "Known IDE Packages", а также пакеты, указанные в под-ключе "Delphi". Пакеты, указанные во всех прочих под-ключах, грузиться не будут. Когда –p не указан, IDE загрузит все пакеты ключа "Known IDE Packages" и все пакеты во ВСЕХ под-ключах.

Настоящий секрет, которым я хочу поделиться сегодня с вами, заключается в том, что выборочная загрузка пакетов не привязана к personality. Это просто общий механизм, который может быть настроен так, как вы захотите. Что означает, что те, кто обожает всё тонко настраивать, только что заимели ещё один инструмент в свою копилку. Вы можете упорядочить пакеты IDE любым удобным вам способом. Всё, что вам надо сделать - отредактировать под-ключи реестра.

Прежде, чем я нырну в обсуждение способов это сделать, я хотел бы изложить важную информацию о ключе –p. Во-первых, вы можете передавать несколько имён под-ключей, разделяя их точкой с запятой. К примеру, если вы хотите загрузить Delphi и Delphi .NET, то вы можете использовать ключ –pDelphi;DelphiDotNet. Второе: пакеты, указанные в самом ключе "Known IDE Packages" будут грузиться всегда, вне зависимости от того, указан ключ –p или нет.

Почему я вообще могу захотеть лезть в конфигурацию моей среды с редактором реестра?

Хороший вопрос. Имеется несколько очевидных ситуаций, когда вы захотите сделать это. Первая будет разработкой компонента, когда вам необходимо отладить код дизайнера компонента. Для этого вы обычно запускаете вторую копию IDE, к которой подключаетесь отладчиком первой IDE. Вам придётся запускать и останавливать эту вторую IDE много раз, поэтому вы сэкономите много времени, если она будет загружать только минимальный набор пакетов, необходимых для отладки. Если у вас достаточно быстрая машина (>= 2 ГГц) с достаточным количеством памяти (>= 768 Мб), то вполне возможно сделать так, чтобы вторая копия запускалась за несколько секунд.

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

Начинаем - сначала резервная копия!

Прежде чем мы начнём, я настоятельно рекомендую сделать вам резервную копию всего ключа реестра HKEY_CURRENT_USER\Software\Borland\BDS\4.0. Проще всего сделать это - перейти на этот ключ в дереве в regedit и выбрать пункт меню File | Export и сохранить ключ в файл на диск (я предлагаю назвать файл типа "BDS 2006 Configuration Backup.reg"). Это - хорошая вещь. Вы сможете легко восстановить свою среду без переустановки, если что-то пойдёт не так. Если вам нужно будет восстановить всё к исходному состоянию, то вы просто удаляете этот ключ реестра и импортируете файл резервной копии. Стоит также заметить, что если вы удалите ключ реестра, но не восстановите его, то перезапуск IDE пересоздаст ключ со значениями по-умолчанию.
Примечание: будьте внимательны и не перепутайте ветки HKEY_CURRENT_USER и HKEY_LOCAL_MACHINE. Мы работаем только с HKEY_CURRENT_USER. Ветка HKEY_LOCAL_MACHINE содержит только значения по-умолчанию и информацию об установке, которая не должна меняться.

Редактирование вашего ключа реестра "Known IDE Packages"

Штатный редактор реестра Windows не умеет перемещать значения ключей между ключами реестра, поэтому мы не сможем использовать его для удобного редактирования конфигураций. Вы можете использовать любой другой редактор реестра, но я обнаружил, что простой текстовый редактор будет работать просто отлично.

Начните работу с экспорта ключа реестра HKEY_CURRENT_USER\Software\Borland\BDS\4.0\Known IDE Packages в файл на диске. Если вы собираетесь использовать редактор реестра, который не поддерживает Unicode, то измените тип файла при сохранении с “Registration Files” на “Win9x/NT4 Registration Files” до нажатия на кнопку "Сохранить". Это создаст файл ANSI вместо Unicode. Я же использовал редактор текста самой IDE, ему подойдёт любой формат.

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

Давайте начнём с перемещения всех пакетов под "Known IDE Packages" в отдельный под-ключ. Это позволит вам легко сделать IDE с практически “нулевым отпечатком” (вспомните, что пакеты в самом ключе "Known IDE Packages" не могут загружаться выборочно, поэтому мы перемещаем их, чтобы позволить выборочную загрузку).

Сделайте копию этой строки около начала файла:

[HKEY_CURRENT_USER\Software\Borland\BDS\4.0\Known IDE Packages]

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

[HKEY_CURRENT_USER\Software\Borland\BDS\4.0\Known IDE Packages\IDECore]

Заметьте, что мы добавили строку “\IDECore”. Файл должен теперь начинаться примерно так:

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Borland\BDS\4.0\Known IDE Packages]

[HKEY_CURRENT_USER\Software\Borland\BDS\4.0\Known IDE Packages\IDECore]

$(BDS)\Bin\Borland.Caliber.IDE100.bpl

……

Как вы можете догадаться, этим простым действием мы переместили все пакеты ключа "Known IDE Packages" в ключ "Known IDE Packages\IDECore".

Чтобы использовать этот модифицированный файл реестра, мы импортируем его. Убедитесь, что вы сохранили изменения на диск и вернитесь в редактор реестра. Перед тем, как импортировать файл, мы переименуем существующий ключ "Known IDE Packages" - это будет нашей резервной копией оригинальных данных. Выберите его в дереве редактора реестра и нажмите F2. Измените имя ключа на “Known IDE Packages.Save1” и нажмите Enter. Теперь вы можете использовать команду меню File | Import и выбрать .reg-файл, который мы редактировали. Или же вы можете просто дважды щёлкнуть по .reg-файлу в Проводнике Windows. После завершения импорта вы увидите новый изменённый ключ "Known IDE Packages". Если вы развернёте его, то увидите, что в нём есть под-ключ IDECore, которого раньше не было. Вы также увидите, что в самом ключе "Known IDE Package" больше нет значений. Если вы захотите восстановить оригинальную конфигурацию, то просто удалите ключ изменённый "Known IDE Packages" и переименуйте ключ "Known IDE Packages.Save1" обратно в "Known IDE Packages".

Чтобы проверить эффект от изменения - откройте командную строку. Она позволит нам проверять различные варианты без необходимости создания кучи ярлыков. Как только вы настроите свои конфигурации - вы можете создать к ним ярлыки позже.

В командной строке смените каталог на папку исполняемых файлов BDS (командой: cd "C:\Program Files\Borland\BDS\4.0\bin").

Сначала давайте проверим нашу нулевую конфигурацию. Если мы передадим в –p несуществующий ключ, то мы просто ничего не загрузим. Поэтому наберите в командной строке такую команду:

BDS –pZero

и смотрите как быстро вскочет IDE! Однако, в этой конфигурации в IDE не загружено никаких полезных пакетов, так что она довольно бесполезна - разве что для редактирования текстовых файлов, но было забавно увидеть, как быстро может запуститься пустая оболочка IDE! Теперь давайте попробуем минимальную personality Delphi. Закройте среду и перезапустите её с такой командной строкой:

BDS –pDelphi

Это займёт больше времени, но не много. Поскольку мы переместили основные пакеты в под-ключ IDECore и не указали его в командной строке, то многие вещи будет пропущены. Затем, давайте закроем среду и попробуем:

BDS –pIDECore;Delphi

В этот раз среда начинает грузиться дольше и вы можете видеть, как грузятся пакеты. Сейчам это в точности эквивалентно конфигурации по-умолчанию для ярлыка "Borland Delphi for Microsoft Win32", который создавал установщик. И последней вещью, которую мы попробуем, будет:

BDS

Эта команда загрузит всё - ровно как это было до того, как мы начали делать изменения. Поскольку мы не указали ключ –p, то среда загружает всё подряд.

Конфигурация-пример

Теперь, когда мы узнали, как делать изменения конфигурации IDE, я покажу вам пример, как вы можете использовать эту технику для создания более тонких конфигураций. Щёлкните по ссылке ниже для просмотра полного варианта, который я создал для примера:

Sample Known IDE Packages

В этом примере я использую несколько подходов. Сначала я разбил каждую personality в ключи “core” и “extra” - в общем, я переместил реже используемые вещи в под-ключ “extra”, а часто-используемые - оставил. Затем, я поделил пакеты из ключа IDECore, который мы создали в нашей тренировке. В моём случае я оставил критические пакеты в IDECore, а менее важные пакеты я занёс в IDEExtras. Наконец, я поделил пакеты IDECore по функциональным категориям. Я переместил все пакеты, которые имеют отношение к Web-разработке, а также плагины ALM в их собственные под-ключи. Все эти изменения привели к разрастанию конфигурации с пяти вариантов до двадцати. Но суммарная функциональность осталась неизменной.

Я также отредактировал описания различных файлов пакетов, чтобы иметь описание для всех. По-умолчанию у многих пакетов вы увидите только “(Untitled)” - что не очень полезно при понимании того, что делает этот пакет.

Используя эту конфигурацию, я могу, например, создать ярлык к BDS.EXE с параметрами –pIDECore;Delphi и назвать его “Delphi Lite”, или –pIDECore;IDEExtras;Delphi;DelphiExtras и назвать его “Delphi Full”.

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

Заключительные мысли

Лично я считаю, что редактирование конфигурации среды под свои нужды - это вполне безопасная ситуация. Однако, поскольку существует неисчислимое множество комбинаций пакетов IDE, вы наверняка столкнётесь с ситуацией неверного поведения IDE в некоторых особых конфигурациях. Если вы столкнётесь с ситуацией, когда что-то не работает - пожалуйста, дайте мне знать. Вы сможете подтвердить аномалии конфигурации, сравнивая её с конфигурацией по-умолчанию. Просто имейте ввиду, что редактирование стандартных конфигураций официально не поддерживается - поэтому нет никаких гарантий.

Дополнительные примечания:
1. Ключ командной строки –p не работает с пакетами компонент, которые устанавливаются через ключ реестра “Known Packages”. В отличие от IDE-пакетов, пакеты компонент могут быть удалены и установлены в самой IDE.
2. Если вы хотите отключить отдельный пакет в реестре, есть несколько способов это сделать. Во-первых, вы можете просто удалить запись о пакете. Наверное, это самый неудачный способ, потому что вам нужно будет как-то восстановить этот ключ для отмены запрета пакета. Второй способ - удалить описание пакета. На самом деле это значение “Data”, ассоциированное с пакетом. Третьим способом (появился в BDS 2006) отключить пакет является редактирование описания так, чтобы первый символ описания был подчёркиванием, например: “_Assembly Browser Package”. Эти трюки позволят вам выборочно отключать пакеты без необходимости их удаления.
3. BDS имеет также ключ –r, который позволяет указать вам альтернативный профиль среды для загрузки - не только конфигурацию пакетов, но и других настроек среды, вплоть до путей поиска файлов и раскладок окон.
4. Раздел справки Delphi, описывающий ключи командной строки.

1 комментарий:

  1. Имхо для этой цели удобнее использовать DelphiSettingManager https://code.google.com/p/delphi-setting-manager/

    ОтветитьУдалить

Можно использовать некоторые HTML-теги, например:

<b>Жирный</b>
<i>Курсив</i>
<a href="http://www.example.com/">Ссылка</a>

Вам необязательно регистрироваться для комментирования - для этого просто выберите из списка "Анонимный" (для анонимного комментария) или "Имя/URL" (для указания вашего имени и ссылки на сайт). Все прочие варианты потребуют от вас входа в вашу учётку (поддерживается OpenID).

Пожалуйста, по возможности используйте "Имя/URL" вместо "Анонимный". URL можно просто не указывать.

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