Что я могу сделать, чтобы уменьшить размер моего исполняемого файла (Delphi)?

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

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

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

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

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

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


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

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

Для получения дополнительной информации о сжатии см. Вопрос Stackru: компрессор Delphi EXE?


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

http://www.beholdgenealogy.com/img/compilingoptions.jpg

http://www.beholdgenealogy.com/img/linkingoptions.jpg

16 ответов

Решение

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

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

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

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

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

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

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

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

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

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

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

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

  • Отладочная информация (настройка компилятора)
  • Информация TD32 (компоновщик)
  • Информация об удаленной отладке (компоновщик)

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

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


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

конфигурация

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

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

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

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

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

Другой способ - взглянуть на вопрос: "Какую единицу увеличить размер?".

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

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

D2007:
"нормальный" сборник: 18.8mb
с отладкой dcu's: 18.8mb (такой же размер!)

D2010
нормальный: 23,9
Dcu отладки: 48,8 МБ (!)

Так что использование debug dcu's удваивает наш exe-размер...

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

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

Редактировать: некоторая информация о скомпилированном размере:
D2007:
альтернативный текст
D2010:
альтернативный текст

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

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

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

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

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

3) Отладочная информация должна добавлять отладочную информацию только к модулю, а не к исполняемому файлу, хотя для создания файла карты требуется IIRC.

Также вы можете изменить значок. Иконка в новейшей Delphi IDE (то есть XE3) совместима с Vista/7 и содержит все размеры (насколько я знаю, до 256x256). Таким образом, вы можете уменьшить размер исполняемого файла с помощью изменения значка.

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

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

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

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

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

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

(Мой опыт с Delphi 5)

Для Delphi 10.3 Rio с настройками по умолчанию:

Шаг 1. Переключитесь с Debugк Releaseв окне "Проекты". Это уменьшило размер моего исполняемого файла с 22 МБ до 5 МБ!

Шаг 2: Используйте компресор exe, такой как ASPack. Это еще больше уменьшило мой exe-файл до 1,3 МБ. Невероятно, не так ли? :)

Снимите отметку с отладочной информации в настройках проекта. Если Embarcadero не может предоставить какое-либо решение или объяснение!!! Я думаю, что решение простое: не зацикливайтесь только на Delphi, там много языков программирования, каждый ограничен только воображением программиста.

Другие вопросы по тегам