В одной из статей, опубликованных ранее ("КВ" №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-страницы), да еще могут лежать дистрибутивы других программ, оптимизированных подобным образом, то можно сделать вывод о том, что оптимизация имеет смысл. При наличии статистики можно получить более-менее точные цифры для каждого конкретного случая. Даже если вы найдете хостера с безлимитными планами по трафику, совсем необязательно, что такое положение вещей будет вечным. Кроме этого, меньший размер дистрибутива, как уже говорилось ранее, это и экономия для пользователей как в оплате ими своего трафика, так и во времени скачивания и связанных с этим возможных проблем.
Так что оптимизацией дистрибутива стоит заниматься, даже если он сам по себе невелик. Как говорится, копейка рубль бережет. И наш, и ваш :).
Юрий А. СМАНЦЕР,
[email protected]
Горячие темы