Что я могу сделать для сокращения размера моего исполняемого файла (Delphi)?

Я выпускаю единственный исполняемый файл (.EXE) для настольной программы с помощью Delphi 2009. У меня нет внешнего DLLs или ресурсов, в которых я нуждаюсь, чтобы программа работала.

Я использую два компонента: ELPack Innovative LMD и TRichView Sergey Tkachenko, которые компилируются в мой исполняемый файл.

Когда я создаю свою производственную версию, с помощью конфигурации сборки "Выпуска", произведенный исполняемый файл составляет 13 533 КБ.

До использования Delphi 2009 я использовал Delphi 4. Исполняемый файл, который это произвело, составлял только 2 671 КБ при слиянии тех же двух компонентов и в основном наличии того же кода как моя текущая версия.

Я действительно понимаю, что Delphi, 2009 является полностью Unicode (который является главной причиной, почему я обновил), и быть Unicode может вызвать до удвоения размера. Но это приблизительно в 5 раз больше.

Существует ли причина, почему мой исполняемый файл должен остаться в 5 раз больше? Или там некоторые простые пути состоят в том, чтобы сократить значительный блок исполняемого размера?


Пожалуйста, примите во внимание. Некоторые люди отвечают способами сжать Delphi EXE. Это не то, что я пытаюсь сделать. Я пытаюсь просто видеть, почему так много пространства используется для удаления то, что не могло бы быть необходимым. Если это сделано, сжатие может все еще быть сделано впоследствии раз так желаемое.

Действительно не имеет значения, насколько большой или маленький исполняемый файл - после того как это установлено. Именно для загрузки целей и минимизировать времена загрузки и загрузки сервера Вы хотите сжать его. Я предпочитаю использовать Установку Inno и сжимать программу в самой стандартной программе установки. Затем, когда это установлено, это расширено до полного размера. То, что и предотвращает возможное обнаружение как вирус и устраняет дополнительное время запуска, должно было распаковать программу в памяти. Также я кодирую знак и мой исполняемый файл и моя стандартная программа установки, и некоторые методы сжатия являются несовместимыми с этим.

Для большего количества информации о сжатии посмотрите вопрос о StackOverflow: Delphi компрессор EXE?


ldsandon попросил, чтобы я обеспечил точно, какие опции я использую, таким образом, здесь они:

Compiling Options
(источник: beholdgenealogy.com)

Linking Options
(источник: beholdgenealogy.com)

23
задан Glorfindel 1 August 2019 в 09:06
поделиться

13 ответов

При переходе с Delphi 7 на Delphi 2010. наши .exe-файлы выросли, например, с 16 до 35 мегабайт.

Я задал похожий на ваш вопрос на форуме Embarcadero несколько недель назад. ( ссылка ) В моем OP я перечислил серию ссылок по этой теме, которые могут быть вам полезны.

Мы пытались использовать UPX для сжатия наших .exe. Если позволить ему работать в течение нескольких часов, наш .exe значительно сократился, но мы, вероятно, не будем использовать его в производстве по следующим причинам:

  1. У нас довольно много .exe, и мы не хотим ждать 1/2 дня для каждой сборки . (Возможно, мы сможем найти набор параметров UPX без перебора, который уменьшит это ...)

  2. Хотя размер файла.exe, а наш shippable - нет, потому что наш установщик (что неудивительно) не может выжать большее сжатие из уже сжатого файла ... тогда как он смог уменьшить исходный файл .exe размером 16 мегабайт. до 8 мегабайт.

  3. Я читал несколько отчетов о том, что в какой-то момент (редко, но не никогда) UPX exe запускал различные антивирусные программы, чтобы сообщить о том, что приложение содержит вирус. (Я не помню дату, сайт или подробности того, где я это видел, поэтому было бы немного несправедливо с моей стороны сообщать об этом здесь.) Но мы настолько не склонны рисковать, что такая возможность может произойти, что UPX вне стола ...

Ссылка на форуме Embarcadero также включает ссылку на другую ветку SO по этой теме.

Я по-прежнему удивляюсь и разочаровываюсь раздуванием кода, которое мы обнаружили при переходе на Delphi 2010. Как отмечает Ник, 2X для Unicode - это слишком много.

Однако раздувание - относительно незначительный компромисс при переходе на D2010, потому что, IMO, D2010 - это потрясающее обновление во многих других отношениях. Но это действительно означает, что нам, вероятно, придется перейти к поставке двух компакт-дисков, а не одного. Я не жду реакции на это со стороны нашей организации ...

14
ответ дан 29 November 2019 в 01:14
поделиться

Если вы не хотите использовать exe-компрессор, то попробуйте StripReloc.

2
ответ дан 29 November 2019 в 01:14
поделиться

Не видя фактических настроек, которые использует ваша конфигурация сборки "Release", объяснение такого увеличения размера требует большого количества спекуляций.

Помимо некоторых, возможно, маловероятных факторов, приводящих к значительному увеличению количества кода, который "протаскивается", даже если он не используется, такое увеличение размера легче всего объяснить включением отладочной информации.

Я бы проверил настройки компилятора и компоновщика на предмет:

  • Отладочная информация (настройка компилятора)
  • TD32 info (компоновщик)
  • Remote debug info (компоновщик)

Сравните эти настройки в вашем проекте Delphi 2009 с эквивалентами в Delphi 4.

10
ответ дан 29 November 2019 в 01:14
поделиться

Стандартные блоки в новой версии delphi могут содержать больше строк и констант, таких как строки ошибок, которые будут включены, даже если вы отключите отладочную информацию. Проверьте, что вы используете.

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

(Мой опыт относится к Delphi 5)

0
ответ дан 29 November 2019 в 01:14
поделиться

Другой способ - посмотреть, «какой блок увеличивает размер?».

Для этого я использую JCL Project Analyzer IDE, интегрированный в IDE с установкой JCL / JVCL, он показывает вам все блоки с их соответствующими размерами. Вы можете экспортировать его в текстовый файл. Если вы сделаете это с двумя средами (D4 и D2009), у вас будет много соответствующей информации.

4
ответ дан 29 November 2019 в 01:14
поделиться

Используйте "upx - сжатие или расширение исполняемых файлов" @ http://upx.sourceforge.net


Если вы перейдете в инструменты / конфигурируете инструменты и настроите его таким образом, вы можете сжать исполняемый файл над которым вы легко работаете через пункт меню в среде IDE.

Configuration

5
ответ дан 29 November 2019 в 01:14
поделиться

Добавлю несколько слов. Компоновщик может удалить неиспользуемые процедуры и функции, только если он может следовать иерархии кода. Кошмарный список компоновщика приведен ниже:

  • Код, управляемый сообщениями, печальная новость заключается в том, что этот код нельзя удалить вообще, поэтому размер пустого проекта Delphi продолжает расти от версии к версии. Каждое новое сообщение Windows (например, WM_TOUCH, насколько я знаю, представленное недавно) создает иерархию вызовов процедур, которую нельзя удалить (даже если вы вообще не планируете использовать Touch API). Это потому, что каждый case фрагмент WM _: - это то, что компоновщик не может решить, будет он использоваться или нет.

  • Доступ к коду и структурам данных осуществляется из секций начала, инициализации и завершения модулей. Здесь у вас есть некоторый контроль, удаление ненужных вызовов или создание объекта. Даже если вы создаете объекты по запросу и освобождаете их только в разделе финализации, делайте это осторожно

7
ответ дан 29 November 2019 в 01:14
поделиться

Вычтите ожидаемое 2-кратное увеличение от Unicode, и в итоге вы получите неучтенное 2,5-кратное увеличение. Это имеет смысл, учитывая, сколько версий вы пропустили. Многое было добавлено в VCL и RTL со времен Delphi 4, и не все из этого - то, что может быть легко отделено умной ссылкой, даже если вы никогда не используете это. В зависимости от того, сколько модулей вы используете, вы можете тащить с собой довольно много дополнительного багажа.

Аллен Бауэр и команда компиляторов добавили новую функцию в D2010, чтобы помочь уменьшить это, но, очевидно, они действуют осторожно и не используют ее в таком количестве мест, как могли бы. Надеюсь, что мы увидим больше возможностей для уменьшения крафта в 2011 и последующих выпусках.

7
ответ дан 29 November 2019 в 01:14
поделиться

1) Вы создаете подробный файл карты, и поскольку вы установили "used debug dcus", он также будет содержать символы для блоков RTL/VCL. Если он используется системой обработки исключений для генерации стеков вызовов и тому подобного, его можно добавить в исполняемый файл. И если его не сжать каким-либо образом, он может сделать размер вашего .exe довольно большим.

2) Использование отладочных dcus также сделает ваш .exe несколько больше, потому что обычно они компилируются без оптимизации и опций отладки, и они также сделают ваш код медленнее. Их не следует использовать в релизной версии.

3) Debug information должна добавлять debig info только в блок, а не в исполняемый файл, хотя она требуется IIRC для генерации файла карты.

2
ответ дан 29 November 2019 в 01:14
поделиться

Я провел несколько тестов, чтобы увидеть разницу между D2007 и D2010, потому что мы обновляемся до D2010. Я протестировал приложение с графическим интерфейсом для управления среднего размера, содержащее около 60 форм (сетки с подробными формами, фреймы и т. Д.). Мы используем компоненты TMS + Remobjects.

D2007:
"нормальная" компиляция: 18,8 МБ
с отладочным контроллером: 18,8 МБ (такой же размер!)

D2010
нормальный: 23,9
debug dcu's: 48.8mb (!)

Таким образом, использование debug dcu удваивает размер нашего exe ...

Протестируйте с нашей бизнес-службой (без больших dfm):
D2007: 12,3 МБ
D2010: 17.1mb

Так что да, D2010 увеличивает exe (немного), но для моего клиента это не проблема.

Edit: некоторая информация о скомпилированном размере:
D2007:
alt text
D2010:
alt text

Итак, увеличение размера кода, но более чем удвоение данных!

4
ответ дан 29 November 2019 в 01:14
поделиться

Поскольку D2010 добавляет расширенный RTTI, а RTTI является печально известным фактором в увеличивая размер exe, было бы интересно посмотреть, насколько велики двоичные файлы D2009 для этого приложения.

Если двоичные файлы D2009 значительно меньше, это не Unicode и т. Д. Что касается моих собственных двоичных файлов, у меня есть только 30% -ное увеличение или около того при переходе от D7 к D2009.

1
ответ дан 29 November 2019 в 01:14
поделиться

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

3
ответ дан 29 November 2019 в 01:14
поделиться

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

@ Tom1952: ASPack работает довольно быстро, всего несколько секунд, чтобы сжать файл

0
ответ дан 29 November 2019 в 01:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: