Оптимизация размера дистрибутива

В одной из статей, опубликованных ранее ("КВ" №7, 2003), мы вели речь о программах для создания дистрибутива. Сегодня рассмотрим вопрос оптимизации его размера. Под оптимизацией в данном случае будет пониматься минимизация размера.

Для чего же нужно минимизировать дистрибутив? Если ваша программа распространяется на отдельном компакт-диске, то вопрос оптимизации размера дистрибутива может и не возникать - по сравнению с емкостью CD, плюс/минус мегабайт (десять мегабайт:) особого значения не имеет. Ну разве что размер инсталлятора близок к емкости самой CD-матрицы, однако сталкиваются с такой ситуацией, я думаю, немногие. Иная ситуация возникает при распространении программы через интернет. Здесь есть две стороны, заинтересованные в минимизации размера инсталлятора. С одной стороны, это пользователь, который скачивает программу по Сети и оплачивает объем трафика и/или время соединения. С другой стороны, это сам разработчик (продавец), который оплачивает трафик своему хостеру. Но о последнем ниже.

Главные вопросы, на которые нужно получить ответ: насколько можно уменьшить размер дистрибутива, с помощью каких средств и стоит ли овчинка выделки?

Для исследования проблемы были снова использованы бесплатные системы для создания дистрибутивов - Inno Setup и Null Soft Install System (NSIS). Это не единственные существующие системы, но для рассмотрения их будет вполне достаточно. Тем более, что речь о них уже велась в предыдущий раз.

Одной из функций, которую выполняет программа для создания инсталлятора, является упаковка (сжатие) файлов, входящих в дистрибутив. В Inno Setup используется метод bzip, можно задать уровень от 0 до 9 или не использовать сжатие. В NSIS также используется bzip-сжатие, однако уровень компрессии установить нельзя, можно только ее включить/отключить/оставить включение на усмотрение NSIS.

 

Попробуем поэкспериментировать с этими параметрами. В качестве исходного материала была взята программа, написанная на Delphi 7, размером 2.26 Mb, файл справки в формате HTML help размером 23 kB, текстовые файлы суммарным объемом около 300 kB. Были созданы скрипты для обеих систем генерации дистрибутивов. Использовались те же версии инсталляционных систем, что и в упомянутой статье, а именно: InnoSetup 3.0.6 и NSIS 1.98. Упаковка модуля программы с помощью упаковщиков кода не проводилась.

В результате эксперимента с изменением параметров сжатия для обеих инсталляционных систем были получены следующие данные (для Inno Setup (сжатие bzip) данные приведены в таблице 1):

Таблица 1
Компрессия,
уровень
Размер,
байт
Нет 2998441
1 1252004
2 1228281
3 1227295
4 1217999
5 1218504
6 1212805
7 1203444
8 1202685
9 1207609

Для NSIS размер дистрибутива, байт: Compressed 989981, Uncompressed 2705457.

Можно заметить, что размер получаемого с помощью InnoSetup дистрибутива зависит от уровня сжатия нелинейно. Так, наименьший размер дистрибутива оказался для уровня 8, а не 9, уровень 4 дал лучшие результаты, чем уровень 5. Вместе с тем разница в размере в 5 килобайт между уровнями 9 и 8 невелика.

Размер дистрибутива, получаемого с помощью NSIS, существенно меньше дистрибутива, сделанного с помощью InnoSetup, но удивляться нечего - это известная особенность NSIS. Разница составляет почти 213 килобайт. Стоит задуматься об использовании NSIS, особенно если учесть использование нового интерфейса в его последних версиях.

Больше из самих инсталляционных систем не выжмешь. Однако многие программисты пользуются одним хорошим приемом, который позволяет еще больше уменьшить размер получаемого дистрибутива. Этот прием состоит в использовании связки инсталлятор+IExpress.

Что такое IExpress? IExpress (текущая версия 2.0) - это бесплатная утилита, входящая в Microsoft IExpress Deployment Kit (IDK), позволяющий создавать самораспаковывающиеся архивы и запускать один из полученных после распаковки модулей. С его помощью можно создавать специфические пакеты - патчи, хотфиксы. IExpress обеспечивает хорошее сжатие. Он оформлен в виде мастера (wizard), пройдя по шагам которого, можно получить требуемый самораспаковывающийся модуль, пользование мастером логически понятно. В нашем случае в архив нужно упаковать дистрибутив, который и будет запущен на выполнение после распаковки.

Попробуем упаковать дистрибутивы, полученные ранее. Размер полученных IExpress-архивов для упакованных дистрибутивов превышает размер самих дистрибутивов на величину порядка 40 кБ, чего и стоило ожидать от двойной компрессии. А вот при использовании неупакованных дистрибутивов получаем выигрыш. Для InnoSetup он составляет 134941 байт (1067744 байт против 1202685 байт bzip/8), а для NSIS еще больше - 162365 байт (827616 байт против 989981 байт compressed). Если двигаться от InnoSetup (1202685) к NSIS (989981), а затем к связке NSIS+IExpress (827616), то получим выигрыш в 375069 байт.

Теперь давайте оценим, стоило ли заниматься оптимизацией? Рассчитаем фактический трафик и его экономию на 100, 1000, 5000 и 10000 закачек. Результаты расчетов отражает таблица 2.

Таблица 2
  100 1000 5000 10000
InnoSetup 120,3 Мб 1.23 Гб 6.0 Гб 12.3 Гб
InnoSetup+IExpress 106.8 Мб 1.07 Гб 5.4 Гб 10.7 Гб
Экономия 13.5 Мб 135 Мб 0.68 Гб 1.35 Гб
NSIS 99 Мб 0.99 Гб 4.95 Гб 9.9 Гб
NSIS+IExpress 82.8 Мб 0.83 Гб 4.1 Гб 8.3 Гб
Экономия 16.2 Мб 162.3 Мб 0.81 Гб 1.62 Гб
InnoSetup 120,3 Мб 1.23 Гб 6.0 Гб 12.3 Гб
NSIS+IExpress 82.8 Мб 0.83 Гб 4.1 Гб 8.3 Гб
Экономия 37.5 Мб 375.1 Мб 1.88 Гб 3.75 Гб

Делаем выводы. В качестве списка месячного лимита трафика на типичных тарифных планах примем линейку в 3;5;10;50 Гб (значения взяты для тарифных планов одного из известных российских хостеров, при этом трафик в 50 Гб имеют несколько тарифных планов разной цены). Видно, что экономия трафика имеет значение при числе закачек дистрибутива программы, приближающемся к 5000 и 10000. В этом случае можно "попасть" на смену тарифного плана (с 5 Гб/($5/месяц) на 10 Гб/($10/месяц) и с 10 Гб/($10/месяц) на 50 Гб/($20/месяц и выше) соответственно). Если учесть, что на сайте размещается не только дистрибутив программы, но и прочие файлы (как минимум, html-страницы), да еще могут лежать дистрибутивы других программ, оптимизированных подобным образом, то можно сделать вывод о том, что оптимизация имеет смысл. При наличии статистики можно получить более-менее точные цифры для каждого конкретного случая. Даже если вы найдете хостера с безлимитными планами по трафику, совсем необязательно, что такое положение вещей будет вечным. Кроме этого, меньший размер дистрибутива, как уже говорилось ранее, это и экономия для пользователей как в оплате ими своего трафика, так и во времени скачивания и связанных с этим возможных проблем.

Так что оптимизацией дистрибутива стоит заниматься, даже если он сам по себе невелик. Как говорится, копейка рубль бережет. И наш, и ваш :).

Юрий А. СМАНЦЕР,
georgesman@mail.ru

Версия для печатиВерсия для печати

Номер: 

28 за 2003 год

Рубрика: 

Software
Заметили ошибку? Выделите ее мышкой и нажмите Ctrl+Enter!