2010-01-27 2 views
11

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

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

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

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

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

+8

@ChaosPandion: Хранение не является единственным соображением здесь. Среди прочего, большие файлы означают большее время загрузки, что влияет на восприятие конечным пользователем качества программы. –

+1

Mason Wheeler: Он также заставляет пользователей чувствовать, что это просто утилита вместо приложения. –

ответ

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

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

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

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

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

+6

Извлечение неиспользуемых устройств может снизить размер EXE. Специально, если они имеют код init (что часто делает код с RTTI (также не D2010) достижимым). Но только если устройство не используется где-то еще в программе, включая сторонние устройства, которые вы используете. Однако гигиена в вашем предложении использования является хорошей практикой. –

+0

Просто выберите «Release» вместо «Debug», и файл из 13mb будет сжат до 2mb !!!!!! – waza123

+0

Мой ответ уже сказал, что когда я написал это шесть лет назад. Зачем говорить это снова? –

2

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

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

+0

Не могли бы вы предложить бесплатный инструмент для второго варианта? –

+1

UPX - это упаковщик с открытым исходным кодом. – vcldeveloper

+0

Другие были быстрее меня, UPX - хорошо известный. – Lucero

12

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

alt text http://kolmck.net/KOLLogo5.gif

Другим вариантом является использование ехе компрессор как UPX

alt text http://upx.sourceforge.net/images/upx12.png

+2

Также см. Http://stackoverflow.com/questions/353634/are-there-any-downsides-to-using-upx-to-compress-a-windows-executable –

+8

Не используйте UPX, если вы не хотите иметь клиентов призывая к тому, что ваши программы появляются в антивирусных предупреждениях весь день. –

+1

@ Марко, я знаю о существовании некоторых отдельных случаев ложных срабатываний, вызванных использованием UPX, однако я считаю, что использование UPX по-прежнему является допустимым вариантом. – RRUZ

6

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

+0

(а также неиспользуемые свойства, время выполнения создает имена компонентов не обязательно, сохраняя некоторые строки) –

+0

DFM - 17'103 b. забыл упомянуть об этом. –

7

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

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

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

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

0

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

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

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

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

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

Смежные вопросы