Размер исполняемого файла Размер исполняемого файла под микроскопом (Марко Кэнту "Delphi 6 для профессионалов")
Занимаясь усовершенствованием библиотеки RTL, инженеры Borland приложили максимум усилий для того, чтобы «срезать лишний жир» с каждого из приложений, разрабатываемых в среде Delphi. Желание уменьшить размер исполняемого файла программы на несколько Кбайт может показаться странным, особенно если принять во внимание, что многие современные приложения распространяются на нескольких компакт-дисках. Однако очень часто разработчикам приходится обращать внимание и на такие мелочи. В некоторых ситуациях даже несколько Кбайт могут иметь значение, например, если речь идет о большом количестве исполняемых файлов, объединенных в единое приложение, или в случае, если исполняемый файл приложения загружается через Интернет. Чтобы продемонстрировать минимизацию размера исполняемого файла, я написал тестовую программу MiniSize. Я не пытался написать самую маленькую по размеру программу, скорее, я поставил перед собой цель написать очень маленькую программу, которая делает нечто любопытное: она сообщает пользователю размер своего собственного исполняемого файла:

Program MiniSize;
uses Windows;
{$R *.RES}
var
nSize: Integer;
hFile: THandle;
strSize: String;
begin
// открыть текущий файл и прочитать размер
hFile := CreateFile (PChar (ParamStr(0)),
0, FILE_SHARE_READ, nil, OPEN_EXISTING, 0, 0);
nSize := GetFileSize (hFile, nil);
CloseHandle (hFile);
// скопировать размер в строку и отобразить ее
SetLength (strSize, 20);
Str (nSize, strSize);
MessageBox (0, PChar (strSize),
'Mini Program', MB_OK);
end.

Программа определяет имя своего собственного исполняемого файла (для этого используется значение первого параметра командной строки ParamStr (0)), открывает этот файл, определяет его размер, преобразует полученное численное значение в строку (при помощи простой функции Str) и отображает результат в виде сообщения. Программа не обладает какими-либо окнами верхнего уровня. Более того, для преобразования целого числа в строку я использую функцию Str для того, чтобы не включать в программу модуль SysUtils, в котором содержатся более сложные функции форматирования и при использовании которого размер результирующего исполняемого файла увеличится. Откомпилировав программу в среде Delphi 5, вы получите исполняемый файл размером 18 432 байта. При использовании Delphi 6 размер исполняемого файла уменьшится до 15 360 — это меньше на целых 3 Кбайт. Заменив длинную строку на короткую строку и несколько модифицировав код, вы можете сделать программу еще меньше — размер исполняемого файла достигнет 9216 байт. Такое возможно благодаря тому, что вы отказываетесь от использования подпрограмм поддержки работы со строками и механизма выделения памяти — этого можно достичь только в программах, которые обращаются к вызовам самого низкого уровня. Обе версии программы можно обнаружить в исходном коде рассматриваемого примера на прилагаемом компакт-диске. Обратите, однако, внимание на то, что все подобного рода решения обладают своими недостатками. В частности, чтобы сократить размер приложений, в которых не используются вариантные переменные, инженеры Borland были вынуждены несколько увеличить размер приложений, в которых такие переменные используются. Преимуществом этого явилось сокращение объема памяти, необходимой для работы приложений, не использующих варианты: если вы не используете вариантные переменные, ваше приложение не будет загружать многомегабайтные системные библиотеки Ole2. На мой взгляд, в этой связи важным является то обстоятельство, что теперь полноценное приложение Delphi, основанное на использовании пакетов времени исполнения, обладает воистину маленьким размером. Обратите внимание на ничего не делающую программу MimiPack, размер исполняемого файла которой составляет 15 972 Кбайт.

Используются технологии uCoz