После прочтения разд. "Delphi, Basic или С" гл. 2, где я уделил повышенное внимание размеру исполняемых файлов, генерируемых компиляторами современных систем программирования, некоторые из читателей, возможно, решили, что я являюсь сторонником тотального минимализма и рекомендую оптимизировать каждый байт кода. Нет, это не так — затраты времени и сил на такую кропотливую работу могли окупиться разве что лет десять назад, когда ни один серьезный программист не мог обойтись без знания ассемблера, а 64 Кбайт (да, вы прочитали правильно, килобайтов, а не мегабайтов) оперативной памяти казались огромным пространством. Я считаю, что размер файла программы должен быть не минимальным, а адекватным ее возможностям, т. е. соответствовать набору функций, предоставляемых пользователю.
"Стоп!" - скажут опытные программисты. — Не имеет значения, каков размер файла программы, важно, каков размер данных, используемых программой!" Абсолютно верно. Программа, ЕХЕ-файл которой имеет объем, например, всего 300 Кбайт, будучи запущенной, займет в оперативной памяти в несколько раз больше места. Дополнительное пространство в памяти "отъедают" переменные и их массивы, используемые программой, но больше всего занятых ресурсов приходится на всевозможные DLL-библиотеки, ведь для реализации почти любой функциональной возможности у Windows заготовлена специальная DLL (табл. 4.1).
Все эти DLL совместно используются разными Windows-приложениями, и когда ваша программа запускается, чаще всего большинство нужных библиотек уже "сидят" в памяти. Именно поэтому стандартный Диспетчер задач в Windows NT и Windows 2000 показывает какие-то дикие цифры — по несколько мегабайтов занимаемой оперативной памяти на каждый запущенный процесс, в том числе и на крошечные вспомогательные утилиты.
Таблица 4.1. Назначение DLL-библиотек в Windows 2000
|
||||
Назначение библиотеки |
Название файла |
Объем файла, Кбайт |
||
Работа с системным реестром Windows |
advapi32.dll |
64 |
||
Элементы управления Windows 9x |
comctl32.dll |
564 |
||
Стандартные диалоги (Открыть файл, Печать т. п.) |
comdlg32.dll |
172 |
||
Поддержка мультимедиа |
devcon32.dll |
352 |
||
Графическая библиотека Windows |
gdi32.dll |
152 |
||
Функции ядра Windows |
kernel32.dll |
460 |
||
Поддержка MFC (для приложений на VC++) |
mfc42.dll |
972 |
||
Сетевые функции |
mpr.dll |
56 |
||
Менеджер аудиосжатия |
msacm32.dll |
100 |
||
Поддержка WebCheck |
msidle.dll |
28 |
||
Runtime-библиотека Visual C++ |
msvcrt.dll |
260 |
||
Сетевые функции |
netapi32.dll |
20 |
||
Поддержка NT API |
ntdll.dll |
20 |
||
Поддержка ActiveX |
ole32.dll oleaut32.dll |
772 582 |
||
Поддержка RPC |
rpcltc1.dll rpcrt4.dll |
28 332 |
||
Функции оболочки Windows |
shell32.dll |
1368 |
||
Поддержка меню, окон и т. п. |
user32.dll |
68 |
||
Поддержка мультимедиа |
winmm.dll |
64 |
||
Однако для shareware размер именно файла программы, а особенно ее дистрибутива, имеет очень большое значение.
В первую очередь это обусловлено, конечно же, тем, что основной средой для распространения программ является Интернет. Несмотря на то, что пропускная способность каналов связи постоянно растет, около половины пользователей испытывают трудности с загрузкой файлов объемом более чем 1 Мбайт. Да-да, примерно 50% пользователей прекращают процесс закачки больших файлов, не дождавшись его завершения (по мере того, как увеличивается размер файла, который требуется загрузить, процент неудачных закачек, естественно, растет). Виной тому, конечно, не зловредность пользователей, а то, что многие из них не применяют специальные программы для загрузки файлов типа ReGet, GetRight, GolZilla и пр., а предпочитают скачивать даже многомегабайтовые файлы, просто щелкая мышью по ссылкам в браузере. Вследствие этого имеет смысл поместить на странице загрузки файла программы рекомендацию все-таки использовать down-load-менеджеры для закачки (Рисунок 4.1).