Как добиться меньшего размера исполняемого файла? - PullRequest
13 голосов
/ 27 января 2010

Совсем недавно я вернулся в Delphi после долгой паузы и написал довольно простое служебное приложение, которое мой клиент попросил поддержать более старую версию ...

Я знаю, что в наши дни размер не имеет большого значения, но мне показалось странным, что приложение, состоящее из одного модуля, составило 1'084'416 б исполняемого файла. Один и единственный блок .pas, который я написал, имеет размер около 20,8 КБ, в основном из-за богатства графического интерфейса.

Предложение uses выглядит следующим образом:

uses
  Windows, Messages, SysUtils, Variants, Classes, Controls, Forms, strutils,
  Dialogs, ADODB, DB, DBGrids, ExtCtrls, DBCtrls, StdCtrls, Grids, Menus,
  Buttons;

Интересно, можно ли как-нибудь уменьшить размер приложения до 300-400 КБ или меньше?

Ответы [ 8 ]

17 голосов
/ 28 января 2010
  1. Вы делали отладочную или выпускную сборку? (Сделать релиз меньшего размера, убедиться, что оптимизация включена, отладочная информация отключена)

  2. Вы выключили RTII (Delphi 2010 и выше), если не нужно? (Меньшие размеры EXE.)

  3. Количество единиц в предложении о вашем основном блоке не является хорошим способом угадать размер EXE. Подумайте об этом следующим образом: сам VCL представляет собой один большой объем кода, другой слой базы данных, и материал, который вы пишете, вероятно, составляет очень небольшой процент от размера EXE.

  4. Чтобы понять размер исполняемого файла, попробуйте JCL Project Analyzer или прочитайте файл MAP, который создается при включении параметра «Карта». Это точно скажет вам, что находится внутри вашего исполняемого файла.

Это было бы глупо по разным причинам, но вы могли бы получить меньший исполняемый файл, например, с помощью Delphi 7. В конце концов, когда я делаю приложение и хочу уменьшить его, я смотрю на то, сколько времени это займет, и сколько усилий требуется для восстановления всего (например, с помощью альтернативы vcl), и затем я говорю себе, забудь это.

13 голосов
/ 27 января 2010
  • Вы можете попробовать использовать KOL (библиотека ключевых объектов - это набор объектов для разработки мощных (но малых ) 32-битных приложений с графическим интерфейсом Windows, использующих Delphi, нобез VCL).KOL позволяет создавать очень компактные приложения с графическим интерфейсом Windows32 (начиная с ~ 11K без сжатия - если предлагается замена системных блоков).Большая часть кода конвертируется во встроенный ассемблер.

  • Другой вариант - использовать exe-компрессор, такой как UPX .

8 голосов
/ 28 января 2010

MapFileStats (DelphiTools.info) - хороший (бесплатный) инструмент, позволяющий увидеть, сколько места занимает каждый модуль в вашем исполняемом файле. Мой собственный инструмент DelphiUnitSizes является альтернативой, которая помимо размеров единиц также отображает размер каждой функции или класса.

В Delphi 2010 исполняемый файл по умолчанию увеличен примерно на 30%, возможно, из-за RTTI, включенного в блоки RTL / VCL, поэтому вы можете использовать более старую версию Delphi для меньшего размера exe-размера.

Как уже упоминали другие UPX также отличный инструмент, ложные срабатывания вирусов-вирусов встречаются не так часто в моем опыте.

Размер исполняемых файлов Delphi можно очень сильно сократить с помощью пользовательских системных модулей и UPX-сжатия. Я могу создавать exe-файлы размером менее 64 КБ с моим игровым генератором на основе Delphi ZGameEditor , даже с Delphi Berlin.

6 голосов
/ 28 января 2010

Насколько велика ваша DFM? Он включен в качестве ресурса в ваш EXE. В зависимости от сложности вашего графического интерфейса вы можете обнаружить, что создание графического интерфейса во время выполнения в коде может уменьшить размер EXE-файла.

3 голосов
/ 14 декабря 2012

Вы также можете добавить следующую строку в начало файла проекта:

{$SetPEFlags 1}

Объяснение здесь: http://hallvards.blogspot.fr/2006/09/hack12-create-smaller-exe-files.html

2 голосов
/ 27 января 2010

Да, но тогда вам нужно будет указать другие единицы кода в качестве дополнительных файлов. Так же, как для .net требовалась сборка, у вас есть среды выполнения VB и т. Д., Это всего лишь среда выполнения Delphi, но она встроена в exe.

Другой вариант - сжать исполняемый файл, для этого есть инструменты.

1 голос
/ 29 января 2010
  • Вы говорите, что возвращаетесь в Дельфы. Если у вас все еще есть старая версия, используйте ее - каждая новая версия добавляет дополнительные функции, и если они вам не нужны, ваши файлы будут меньше без них.

  • Убедитесь, что вы используете только те единицы измерения, которые действительно используете.

Но что бы вы ни делали, я очень сомневаюсь, что вы снизитесь до 300к. Если память будет работать, даже приложение «hello world» в Delphi 2 будет больше этого размера.

0 голосов
/ 28 января 2010

Есть ли у вас файлы ресурсов или рисунки, связанные с проектом?

Я думаю, что ADODB также включает в себя некоторые накладные расходы. Если ваше приложение действительно использует базу данных, то всего 1 МБ неплохо для размера файла? Не забывайте, что ваше приложение - это просто exe - не нужно никаких дополнительных библиотек и т. Д.

...