Что я могу сделать, чтобы уменьшить размер моего исполняемого файла (Delphi)? - PullRequest
22 голосов
/ 08 июля 2010

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

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

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

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

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

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


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

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

Дополнительную информацию о сжатии см. В вопросе StackOverflow: Компрессор Delphi EXE?


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

Параметры компиляции http://www.beholdgenealogy.com/img/compilingoptions.jpg

Параметры связывания http://www.beholdgenealogy.com/img/linkingoptions.jpg

Ответы [ 15 ]

14 голосов
/ 08 июля 2010

При переходе с 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 является таким потрясающим обновлением во многих других отношениях. Но, это означает , что нам, вероятно, придется перейти к поставке 2 компакт-дисков, а не одного. Я не с нетерпением жду реакции нашей организации на это ...

10 голосов
/ 08 июля 2010

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

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

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

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

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

7 голосов
/ 09 июля 2010

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

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

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

7 голосов
/ 08 июля 2010

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

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

5 голосов
/ 08 июля 2010

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


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

Configuration

4 голосов
/ 12 июля 2010

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

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

D2010нормальный: 23,9dcu отладки: 48.8mb (!)

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

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

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

Редактировать: некоторая информация о скомпилированном размере:D2007:alt textD2010:alt text

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

4 голосов
/ 08 июля 2010

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

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

3 голосов
/ 07 августа 2010

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

2 голосов
/ 09 июля 2010

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

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

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

2 голосов
/ 08 июля 2010

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

...