Уменьшение размера исполняемого файла
Модератор: Модераторы
- Лекс Айрин
- долгожитель
- Сообщения: 5723
- Зарегистрирован: 19.02.2013 16:54:51
- Откуда: Волгоград
- Контактная информация:
pupsik, не совсем верно. Для линукса все усугубляется приведением вызовов в вин подобный вид. Но в целом, скорее речь идет о неправильном проектировании самих библиотек. (ну или оптимизатора) Думаю, не сильно ошибусь, если скажу, что переписав LCL можно сильно уменьшить код не влияя на кроссплатформенность. Подозреваю так же, что поддержка дельфийского кода сыграла свою печальную роль.
vitaly_l, то на то, имхо, и выйдет.
vitaly_l, то на то, имхо, и выйдет.
Мне кажется что не сколько в LCL, а и FPC играет роль. Учитываю что используя фпс 3 + бинарник меньше на 100 кб, нежели в 2.6 
Лекс Айрин писал(а):то на то, имхо, и выйдет.
Сомневаюсь... Допустим в программе 1111 классов. У них 1111 имён, весом по 111 Kb каждое имя... соответственно вес программы только за счёт этих имён увеличивается на 123 321 Кб - это довольно большое число.
Предположим только 5-ть из них суть есть внешние, то тогда нужно будет оставить только 555 Кб из 123 321 Кб, соответственно программа уменьшится на 122 766 Кб, если это число (122 766 Кб) перевести в мегабайты, то это вообще страшное число, от которого мурашки по коже. А Вы говорите, одно и тоже... Но суть понятна. И лишний, мёртвый код, на самом деле - тоже можно просчитать до компиляции и удалить; Но обсуждать это бессмысленно, т.к. никто делать не будет, только время потратим.
pupsik писал(а):Учитываю что используя фпс 3 + бинарник меньше на 100 кб, нежели в 2.6
Это не то число, там должно быть минимум 3 мегабайта.
.
Вы о чем?там должно быть минимум 3 мегабайта.
Насчет размера строк. Попробуйте упакуйте текстовый файл. Т.е. архиватором. Как сильно изменится размер архива? И какое кол-во строк необходимо для сильного увеличения размера? Это грубый пример, но..о...
Вы пишете что путем уменьшения кол-ва строк будет сильно уменьшен размер... Для меня - это странный вывод. На кб. повлияет, а ощутимого уменьшения не будет.
п.с.
Всё же весьма интересно узнать - почему такой размерчик. Борланд хоть на VCL "грешил".
Хотя, учитывая, размерчики ХЕ... Уже не знаю: на что они "грешат".
Используя разные "приблуды" или АПИ системы можно уменьшить размер. Но..о - увеличит стоимость разработки и время. А принимать такое увеличение только из-за "дань моде", или "размеры диска позволяют" хм..м как то очень проф. звучит
- Лекс Айрин
- долгожитель
- Сообщения: 5723
- Зарегистрирован: 19.02.2013 16:54:51
- Откуда: Волгоград
- Контактная информация:
pupsik, если программировать под чистым FPC (winAPI), то код делаtтся неприлично маленьким, даже если подключать ресурсы к проекту.
что за нереальные цифры вы говорите... во первых, откуда столько классов? Ну 500, от силы 600 я бы еще понял (хотя реально их вряд ли больше 100). Вес одного имени измеряемый в КИЛОБАЙТАХ это просто тихий ужас... немцы вместе с финнами нервно курят в сторонке. Не забывайте, что 1 килобайт это минимум 256 символов. (UTF8|UTF16), а так как в качестве идентификаторов идут только латинские символы, то и все 1024. длинна же идентификатора удобная для человека ну никак не больше 50 символов.
Можно. Но так как размер уже мало ограничивает программистов, то никто не собирается усложнять оптимизатор. А кто хочет малого размера, то выбирает либо другие библиотеки компонент, либо программирует в winAPI (LinAPI)
Добавлено спустя 7 минут 47 секунд:
pupsik, для комплекса программ типа офисного пакета или полноценного графического редактора VLC/LCL очень удобна Да и мертвого кода там в сумме поменьше. Да и то, подозреваю, некоторая часть кода написана (или со временем переписывается) в winAPI или даже на ассемблере.
Проблема размера остро стоит для утилит, которые должны быстро загрузиться, выполнить свою работу и уйти по английски в трей (завершиться), для драйверов и игр. Хотя последний пункт все чаще уже неактуален.
vitaly_l писал(а): Допустим в программе 1111 классов. У них 1111 имён, весом по 111 Kb
что за нереальные цифры вы говорите... во первых, откуда столько классов? Ну 500, от силы 600 я бы еще понял (хотя реально их вряд ли больше 100). Вес одного имени измеряемый в КИЛОБАЙТАХ это просто тихий ужас... немцы вместе с финнами нервно курят в сторонке. Не забывайте, что 1 килобайт это минимум 256 символов. (UTF8|UTF16), а так как в качестве идентификаторов идут только латинские символы, то и все 1024. длинна же идентификатора удобная для человека ну никак не больше 50 символов.
vitaly_l писал(а):И лишний, мёртвый код, на самом деле - тоже можно просчитать до компиляции и удалить;
Можно. Но так как размер уже мало ограничивает программистов, то никто не собирается усложнять оптимизатор. А кто хочет малого размера, то выбирает либо другие библиотеки компонент, либо программирует в winAPI (LinAPI)
Добавлено спустя 7 минут 47 секунд:
pupsik, для комплекса программ типа офисного пакета или полноценного графического редактора VLC/LCL очень удобна Да и мертвого кода там в сумме поменьше. Да и то, подозреваю, некоторая часть кода написана (или со временем переписывается) в winAPI или даже на ассемблере.
Проблема размера остро стоит для утилит, которые должны быстро загрузиться, выполнить свою работу и уйти по английски в трей (завершиться), для драйверов и игр. Хотя последний пункт все чаще уже неактуален.
pupsik писал(а):Вы о чем?
Создайте пустой проект, положите на него всяких элементов и какого нить кода на 777 Кб и откомпилируйте, получится 3,33 Мб
Подключите LLCL и снова откомпилируйте, программа станет весить 0,33 Mb...
Соответственно, как минимум: 3 Мб в коде были "мёртвым кодом".
Лекс Айрин писал(а):Но так как размер уже мало ограничивает программистов, то никто не собирается усложнять оптимизатор.
Вот это уже больше похоже на правду.
Лекс Айрин писал(а):немцы вместе с финнами нервно курят в сторонке. Не забывайте, что 1 килобайт это
Я утрирую. Чтобы придать вес "проблеме". В хорошей программе - каждый бит важен.
.
не тестил. Я предпочитаю "грязный" иде, без синеватого намекапод чистым FPC (winAPI)
vitaly_l Вы, явно, не о том... Я о формочках, а вы о консольке. Конечно юзверю проще с консолькой, нежели в гуи
Вопрос не о размерах консольного варианта, а о гуишке. Т.е. возьмите и проверьте: на сколько кб уменьшится пустая форма в 2.6 и 3.3.1...
Как и проверьте свою теорию о строках. Архиватором. А потом представьте: если этот текст "обернуть" в xml. Т.е. теги - черненький ящик. Из-за которого сыр бор. Т.е. что "пихается" в бинарник? Повторюсь: это грубый подход...
п.с
Тьфу ты: не досмотрел. Вы LLCL подключали. Но..о 3 + метра. Хм..м - многовато 2 + пустая... Тем более LLCL - не показатель для LCL. Учитывая что вы используете черный ящик. Т.е. откуда вы знаете каким образом работает LLCL? Вы бы ещё KOL учли. Там размерчик поменее будет.
- Лекс Айрин
- долгожитель
- Сообщения: 5723
- Зарегистрирован: 19.02.2013 16:54:51
- Откуда: Волгоград
- Контактная информация:
vitaly_l писал(а):Подключите LLCL и снова откомпилируйте, программа станет весить 0,33 Mb...
Тут вы не правы... не весь этот код мертвый. Часть из него избыточна. Это, например, могут быть обработчики исключений.
vitaly_l писал(а):В хорошей программе - каждый бит важен.
К сожалению, в силу особенностей системы и конкретно формата PE добиться экономии в 1бит невозможно. Дело в том, что есть, например, выравнивание сегментов/секций/заголовков, если не ошибаюсь, на границу в 16 байт минимум.
pupsik писал(а):Я предпочитаю "грязный" иде, без синеватого намека
Это уже нюансы.
знаю. Но, неужто 3кб файлик получается? Да и разговор то о лазаре, а не фпс. Хоть и касается обоих.Это уже нюансы.
- Лекс Айрин
- долгожитель
- Сообщения: 5723
- Зарегистрирован: 19.02.2013 16:54:51
- Откуда: Волгоград
- Контактная информация:
pupsik, я не знаю как в LLCL, но под API я видел программы от 70 килобайт. (не использующих дополнительные библиотеки).
Лазарь это, грубо говоря, оболочка (текстовый редактор/редактор форм) над FPC, позволяющая удобно использовать библиотеку LCL. Программу он компилировать сам не может.
pupsik писал(а):а и разговор то о лазаре, а не фпс.
Лазарь это, грубо говоря, оболочка (текстовый редактор/редактор форм) над FPC, позволяющая удобно использовать библиотеку LCL. Программу он компилировать сам не может.
Пример простой программы на LCL без использования дизайнера форм и соответственно файла ресурсов.
Если интересно чего там так много откройте бинарник в блокноте и посмотрите, особенно ближе к концу.
Код: Выделить всё
{$APPTYPE GUI}
{$mode objfpc}{$H+}
program SimpleForm;
uses
{$IFDEF UNIX}{$IFDEF UseCThreads}
cthreads,
{$ENDIF}{$ENDIF}
Classes, Controls, Dialogs, Interfaces, Forms, StdCtrls;
type
{ TMyForm }
TMyForm = class(TForm)
public
edFirst : TEdit;
edSecond: TEdit;
lbFirst : TLabel;
lbSecond: TLabel;
btnExit : TButton;
procedure IntFilter(Sender: TObject; var Key: Char);
procedure ExitApplication(Sender: TObject);
procedure ExitAction(Sender : TObject; var CanClose : boolean);
constructor Create(AOwner: TComponent); override;
end;
{ TMyForm }
procedure TMyForm.IntFilter(Sender: TObject; var Key: Char);
begin
if not (Key in ['0'..'9', #8, #13]) then
Key:=#0;
end;
procedure TMyForm.ExitApplication(Sender: TObject);
begin
Close;
end;
procedure TMyForm.ExitAction(Sender: TObject; var CanClose: boolean);
begin
CanClose:=MessageDlg('Предупреждение', 'Вы уверены что хотите закончить?',
mtConfirmation, [mbYes, mbNo], 0) = mrYes;
end;
constructor TMyForm.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
Caption:='Hello world';
Position:=poScreenCenter;
edFirst:=TEdit.Create(Self);
with edFirst do begin
SetBounds(10, 30, 300, 21);
Anchors:=[akTop, akLeft, akRight];
OnKeyPress:=@IntFilter;
Parent:=Self;
end;
lbFirst:=TLabel.Create(Self);
with lbFirst do begin
Caption:='First';
SetBounds(10, 15, 100, 21);
FocusControl:=edFirst;
Parent:=Self;
end;
edSecond:=TEdit.Create(Self);
with edSecond do begin
SetBounds(10, 90, 300, 21);
Anchors:=[akTop, akLeft, akRight];
OnKeyPress:=@IntFilter;
Parent:=Self;
end;
lbSecond:=TLabel.Create(Self);
with lbSecond do begin
Caption:='Second';
SetBounds(10, 75, 100, 21);
FocusControl:=edSecond;
Parent:=Self;
end;
btnExit:=TButton.Create(Self);
with btnExit do begin
Caption:='Выход';
SetBounds(230, 205, 75, 25);
Anchors:=[akBottom, akRight];
OnClick:=@ExitApplication;
Parent:=Self;
end;
ActiveControl:=edFirst;
OnCloseQuery:=@ExitAction;
end;
var f1: TMyForm;
begin
Application.Initialize;
Application.CreateForm(TMyForm, f1);
Application.Run;
end.
Если интересно чего там так много откройте бинарник в блокноте и посмотрите, особенно ближе к концу.
То что это оболочка - знакомо
Значит вывод: не зависимо или на фпс, или используя лазарус. По идее ???
скалогрыз 3 кб - с формой (просто на данный момент не могу скачать с форума. Рег. не помню
)?
Mikhail я уже ранее писал. Я более кнопко-нажиматель. Т.е. очень предпочитаю шлёпать морду проги, а не писать. Время меньше, затрат меньше.
скалогрыз 3 кб - с формой (просто на данный момент не могу скачать с форума. Рег. не помню
Mikhail я уже ранее писал. Я более кнопко-нажиматель. Т.е. очень предпочитаю шлёпать морду проги, а не писать. Время меньше, затрат меньше.
- Лекс Айрин
- долгожитель
- Сообщения: 5723
- Зарегистрирован: 19.02.2013 16:54:51
- Откуда: Волгоград
- Контактная информация:
pupsik, вообще-то, можно и в лазаре писать консольные программы. Просто проще для этого использовать блокноты для программистов (или обычные, что не совсем удобно. )
pupsik писал(а):Mikhail я уже ранее писал. Я более кнопко-нажиматель. Т.е. очень предпочитаю шлёпать морду проги, а не писать. Время меньше, затрат меньше.
В данном случае еще и результат одинаковый.
Добавлено спустя 56 секунд:
Лекс Айрин писал(а):Просто проще для этого использовать блокноты для программистов (или обычные, что не совсем удобно. )
Не проще, хорошая IDE всегда пригодится.
