Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Размер приложения XE2


Автор: StayAtHome 4.6.2012, 19:57
Пытаюсь скомпилировать свою старую DLL (плагин к Total Commander) в 64разрядный вариант. Для этого попробовал Embarcadero Rad Studio XE2. Размер при компиляции в Delphi 7 ~570 КБ, при компиляции в XE2 -- 2,4 МБ ! Это "нормально" или я где-то перемудрил? Если не нормально, то куда копать?

Автор: DarkProg 4.6.2012, 20:50
Не знаю что за плагин, но IMHO много, хотя если вы подключили много базовых библиотек, которые потянули за собой чёрти сколько всего, то размерчик адекватен.

А делали полный билд в режиме релиза?

Автор: StayAtHome 4.6.2012, 21:23
Делал. Разница не заметна особо. Особо ничего не подключал, сторонние библиотеки не юзал -- 1 свой компонент и все.

Автор: XperT 4.6.2012, 21:55
Покажите uses длл-ки и своего компонента

Автор: Keeper89 4.6.2012, 22:04
Пути - почистить Uses (CnPack это умеет, например) и сжать UPXом.

Автор: StayAtHome 4.6.2012, 22:12
Цитата(XperT @  4.6.2012,  21:55 Найти цитируемый пост)
Покажите uses длл-ки и своего компонента 

Код

uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,  Dialogs, StdCtrls, ExtCtrls, ComCtrls, Menus;

uses SysUtils,  Windows,  Messages,  Forms;

uses Windows, Messages, SysUtils, Classes, Controls, Forms;

uses Windows, Classes, Controls, Forms,  StdCtrls, ExtCtrls, Spin, XPMan;

uses IniFiles, Graphics;

uses Types, Classes, Messages, Controls, StdCtrls;

uses  Windows, Forms, StrUtils, ClipBrd, Graphics;


Автор: StayAtHome 4.6.2012, 22:50
CNPack мало что почистил из Uses -- размер не изменился 

Автор: XperT 4.6.2012, 22:55
Зачем в дллке Forms,  Dialogs, Messages, XPMan? А так же сомнительна необходимость ClipBrd.

Скомпилировал пустой проект под делфи 2010 (это так, которая уже с юникодом) используя все эти uses и получил 805 Кб. К сожалению ХЕ2 под рукой нету, но мне кажется, что больше 1,5 Мб быть не должно.

Автор: northener 5.6.2012, 00:28
Цитата(XperT @  4.6.2012,  22:55 Найти цитируемый пост)
Скомпилировал пустой проект под делфи 2010 (это так, которая уже с юникодом)

А надо было по крайней мере под ХЕ, имхо.

Автор: bems 5.6.2012, 02:39
Keeper89, пакеры не нужны

Автор: Keeper89 5.6.2012, 03:08
bems, почему?

Автор: StayAtHome 5.6.2012, 09:03
Цитата
Зачем в дллке Forms,  Dialogs, Messages, XPMan? А так же сомнительна необходимость ClipBrd.

Это ж не просто DLL-ка, а плагин для TC. Он отображает свою форму с контролами. 

Автор: Snowy 5.6.2012, 11:03
Цитата(StayAtHome @  4.6.2012,  20:57 Найти цитируемый пост)
при компиляции в XE2 -- 2,4 МБ ! Это "нормально" или я где-то перемудрил?
Это нормально, если используется VCL.
Forms нынче довольно пухленький.

Автор: StayAtHome 5.6.2012, 13:54
Цитата

Это нормально, если используется VCL.
Forms нынче довольно пухленький. 

Печально. Есть какие-то способы борьбы с этим, кроме как переход на чистый WinAPI ? В упаковке -- особого смысла не вижу.
Или можно получить 64-разрядную DLL на менее "пухлых" версиях Delphi ?

Автор: Keeper89 5.6.2012, 14:16
StayAtHome, нет, нельзя. А почему размер так критичен? И почему упаковать - не вариант?

Автор: StayAtHome 5.6.2012, 14:25
Keeper89, критична скорость загрузки плагина, считаю что грузить 2,5 МБ будет дольше чем 0, 5 МБ. Да, поскольку это DLL вероятно повторный вызов будет уже без посторной загрузки (вероятно т.к. не сильно искушен в архитектуре TC). Но такой рост размера меня лично сильно шокирует smile Аж охота пользоваться XE2 пропала.
Упаковать -- выиграем в размере, проиграем в скорости распаковки. Смысл? 

Автор: Alexeis 5.6.2012, 15:11
Цитата(StayAtHome @  5.6.2012,  15:25 Найти цитируемый пост)
Keeper89, критична скорость загрузки плагина, считаю что грузить 2,5 МБ будет дольше чем 0, 5 МБ.

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

Автор: Snowy 5.6.2012, 16:30
dll может быть и 300 метров - в память он грузиться целиком не станет.
Вот если он упакован пакером, тогда станет.
Так что не думаю, что размер критичен. Если его заархивировать, то получится всего полметра.
Для инета не критично. Для винта вообще не заметно.
Я бы не заморачивался бы на эту тему.

Автор: Alexeis 5.6.2012, 21:36
Вот кстати одна из причин роста монстраобразности исполняемых модулей
Код

// Без рефлексии
var
  foo : TFoo;
begin
  foo := TFoo.Create();
  foo.Hello();
end;
 
// С рефлексией
var
 c : TRttiContext;
 t : TRttiInstanceType;
 foo : TValue;
begin
   c := TRttiContext.Create;
   t := (c.FindType('TFoo') as TRttiInstanceType);
   foo := t.GetMethod('Create').Invoke(t.MetaclassType,[]);
   t.GetMethod('Hello').Invoke(foo,[]);
   c.Free;
end.
//сперто http://ru.wikipedia.org/wiki/%D0%9E%D1%82%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%28%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%29#Delphi_2010

Автор: MetalFan 5.6.2012, 22:08
Alexeis, ухты...

Автор: northener 6.6.2012, 01:42
Цитата(MetalFan @  5.6.2012,  22:08 Найти цитируемый пост)
ухты... 

А чему удивляемся? smile

Автор: MetalFan 6.6.2012, 07:18
northener, да я просто сам таким не пользуюсь... примеры видел, но видать забыл уже, что такое возможно.
А практическое применение такому где может быть?

Автор: bems 6.6.2012, 08:43
Цитата(Keeper89 @  5.6.2012,  03:08 Найти цитируемый пост)
bems, почему? 

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

Автор: Alexeis 6.6.2012, 08:53
Цитата(MetalFan @  6.6.2012,  08:18 Найти цитируемый пост)
А практическое применение такому где может быть? 

  Ну одно из применений может быть в купе с компилятором делфей. Самомодифицирующаяся программа. Внутри программы создал код bpl, загрзузил и заюзал, то что только что написал. 
  Можно также представить себе сиситему плагинов, где в xml файле будет описано содержимое плагина (классы и функции), а также несколько вариантов конфигураций, в виде возможных значений параметров (кстати о плагинах). В любом случае это неплохая альтернатива COM. 
  Еще неплохой пример. Браузер грузит html страничку, находит тег embed / object и используя метаинформацию из него определяет кто должен рендерить содержимое и какие данные нужно передать объекту для правильной работы. 
  Вспоминаем типичную схему разработки классов на COM. Написали класс, к нему максимально полный интерфейс. Через пару месяцев возникла необходимость расширить его. Что делаем? Пишем новый дополняющий старый. Потом 3й, 4й 5й и получаем форменное безобразие. С другой стороны далеко не всегда позднее связывание требует максимального быстродействия. Можно сочетать интерфейсы с рефлексией. Например, там где требуется максимальное быстродействие используем COM интерфейсы, которые получаем из объектов, которые были созданы и связаны с основной программой по их строковому описанию.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)