Уменьшение размера исполняемого файла

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Re: Уменьшение размера исполняемого файла

Сообщение SSerge » 23.10.2015 17:01:32

vitaly_l писал(а):то она будет весить на примерно 33% меньше.


Щас. Реальное уменьшение менее процента не хотите?
Если, конечно, подходить с той точки зрения "де я буду использовать переменные из одной буквы, или двух и сокращу размер кода", то это в какой то мере действует на размер исходника, но никакого отношения не может иметь к откомпилированному коду и его размеру.

ЗЫ, vitaly_l, вот вам идея: вкупе с оператором Гото нужно использовать только однобуквенные переменные! Этим резко сократится размер кода. Еще можно и нужно все операторы печатать компактно в одну строку! Так ваша программа может поместиться целиком на одном экране! :mrgreen:
SSerge
энтузиаст
 
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Re: Уменьшение размера исполняемого файла

Сообщение Mikhail » 23.10.2015 17:02:16

Лекс Айрин писал(а): Я, кстати, не понял почему форму нельзя создать не включая ее прототип в файл.

Можно и без подключения ресурса создать форму. Это делается с помощью конструктора Create. Если нужно загрузить форму из ресурса, то используется метод CreateForm, объекта Application, ИМХО.

Лекс Айрин писал(а): По идее, проще создать процедуру рисования формы.
:?

Лекс Айрин писал(а):Соглашусь, если уж так необходимо сообщить об ошибке, то да, но я бы все равно не использовал бы вызов процедуры.

С точки зрения структурного программирования нужно вызвать именно процедуру, а что уж Вы внутри нее будете делать это другое дело, можно установить флаги, ругнуться в лог или аварийно завершить приложение или чего еще.
Mikhail
энтузиаст
 
Сообщения: 565
Зарегистрирован: 24.10.2013 16:06:47

Re: Уменьшение размера исполняемого файла

Сообщение Лекс Айрин » 23.10.2015 17:08:06

Вообще, я видел использование перехода из одной процедуры в другую -- но это такая тонкая и не всегда применимая оптимизация по времени выполнения.

Добавлено спустя 3 минуты 13 секунд:
Mikhail писал(а):Можно и без подключения ресурса создать форму.


Ну-ну... хотелось бы подробностей.

Mikhail писал(а):С точки зрения структурного программирования нужно вызвать именно процедуру,


угу... вы это говорите в теме по оптимизации...
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Уменьшение размера исполняемого файла

Сообщение Mikhail » 23.10.2015 17:24:25

Лекс Айрин писал(а):Ну-ну... хотелось бы подробностей.

Соврал :oops: , для создания без ресурса нужно использовать конструктор СreateNew формы, но RTTI для класса все равно будет создана. :)

Лекс Айрин писал(а):угу... вы это говорите в теме по оптимизации...


Это преждевременная оптимизация, экономия на спичках. :mrgreen:
Mikhail
энтузиаст
 
Сообщения: 565
Зарегистрирован: 24.10.2013 16:06:47

Re: Уменьшение размера исполняемого файла

Сообщение vitaly_l » 23.10.2015 17:30:43

SSerge писал(а):Щас. Реальное уменьшение менее процента не хотите?
Если, конечно, подходить с той точки зрения "де я буду использовать переменные из одной буквы, или двух и сокращу размер кода", то это в какой то мере действует на размер исходника, но никакого отношения не может иметь к откомпилированному коду и его размеру.

Я Вам отвечу словами скалогрыза из другой ветки, скалогрыз профи и привёл документацию:
скалогрыз писал(а):даже если не использовать RTTI, то всё-равно имя класса является частью его VMT таблицы. Т.е. имя будет записано как оно есть. Никакия оптимизаторы секцию .data вроде как не трогают (они занимаются кодом)
Судя по исходникам FPC (ncgvmt.pas) никаких возможностей для манипуляций не предусмотрено.


Сколько классов подключено в Вашей программе?


.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: Уменьшение размера исполняемого файла

Сообщение Лекс Айрин » 23.10.2015 17:50:42

Mikhail, если не делать этого заранее, то потом будешь очень долго переделывать прогу и ругаться за то, что не сделал этого заранее. Я уже это проходил(((

Mikhail писал(а):но RTTI для класса все равно будет создана.


Конечно. Ведь это же возможность языка (компилятора). К тому же реализованная немного странным образом.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Уменьшение размера исполняемого файла

Сообщение Mikhail » 23.10.2015 18:00:35

Лекс Айрин писал(а):Mikhail, если не делать этого заранее, то потом будешь очень долго переделывать прогу и ругаться за то, что не сделал этого заранее. Я уже это проходил(((

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

Лекс Айрин писал(а):Конечно. Ведь это же возможность языка (компилятора). К тому же реализованная немного странным образом.

Да обычным образом она реализована, как у всех. :)

Причиной генерации RTTI является вот этот фрагмент кода
Код: Выделить всё
{$M+}

  TPersistent = class(TObject)
  private
    procedure AssignError(Source: TPersistent);
  protected
    procedure AssignTo(Dest: TPersistent); virtual;
    procedure DefineProperties(Filer: TFiler); virtual;
    function  GetOwner: TPersistent; dynamic;
  public
    destructor Destroy; override;
    procedure Assign(Source: TPersistent); virtual;
    function  GetNamePath: string; virtual; {dynamic;}
  end;

{$M-}   


Постройте свою библиотеку от TObject и RTTI не будет. Некоторый оверхед будет и при использовании TObject из-за vmt. Но и здесь можно выкрутиться, не используйте class-ы. :)
Mikhail
энтузиаст
 
Сообщения: 565
Зарегистрирован: 24.10.2013 16:06:47

Re: Уменьшение размера исполняемого файла

Сообщение Лекс Айрин » 23.10.2015 18:19:10

Mikhail писал(а):Да обычным образом она реализована, как у всех.


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


Mikhail писал(а):Постройте свою библиотеку от TObject и RTTI не будет.


Куда же я денусь. Начинал, но не смог разобраться в заворачиванием кодов создания/запуска окна в виде методов объекта. Просто не понимаю самого принципа. Вне объекта, как ни странно работает. Но я, со временем, разберусь.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Уменьшение размера исполняемого файла

Сообщение sign » 24.10.2015 07:29:05

vitaly_l писал(а):Я описал принцип, т.к. GoTo - очень хорошо позволяет доказать что в РАБОТЕ программы нет никаких имён!

Спешу вам сообщить, что ваше MyLovelyGoto - это имя. И адрес1 - это тоже имя. :mrgreen:
sign
энтузиаст
 
Сообщения: 1131
Зарегистрирован: 30.08.2009 09:20:53

Re: Уменьшение размера исполняемого файла

Сообщение vitaly_l » 24.10.2015 12:19:23

sign писал(а):Спешу вам сообщить, что ваше MyLovelyGoto - это имя. И адрес1 - это тоже имя.

А как ещё я Вам напишу, адрес, если его назначает линковщик после ассемблирования и компилирования?
все ассемблеровские "закорючки", превратятся в нечто такое: 0001 0000 0010 0111

Но важно другое, со слов скалогрыза: даже если не использовать RTTI, то всё-равно имя класса является частью его VMT таблицы. Т.е. имя будет записано как оно есть. Никакия оптимизаторы секцию .data вроде как не трогают (они занимаются кодом) Судя по исходникам FPC (ncgvmt.pas) никаких возможностей для манипуляций не предусмотрено.

Из этого следует что, в бинарном коде помимо нормальных и легко читаемых значений, типа: 0001 0000 0010 0111, будут ещё видны дурацкие сложночитаемые названия всех классов и функций, т.к. идентификация функций внешних библиотек определяются по имени.
Вот эти дурацкие сложночитаемые имена, типа: TMyLovelySuperPuperDlinnyiNameClass - нужно уничтожить в бинарном коде, или хотя-бы превратить в T1, T2, T3. Потому что, классов в любой программе - очень много и не только Вами написанных.

И даже когда программа сравнивает: if ('TMyLovelySuperPuperDlinnyiNameClass' = varStringTest) then <== это дольше работает нежели обфускацированная конструкция сравнивания: if ('T1' = varStringTest) then И так нужно поступить со всеми элементами, которые сохраняют в бинарном виде свои имена! Но увы, такой фичи нет в IDE - и это расстраивает :cry: . Самому сокращать имена классов нельзя, т.к. неудобно будет их идентифицировать, соответственно - это должен делать ОПТИМИЗАТОР и только по требованию программиста.

.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: Уменьшение размера исполняемого файла

Сообщение Лекс Айрин » 24.10.2015 13:03:13

vitaly_l, проблема в том, что имена классов и не должны быть видны в программе. Объект, согласно концепции ООП это самодостаточная конструкция, в которой все уже есть. Максимум, что должно быть, это способ запуска объектов из внешней библиотеки. Что, кстати, не реализовано в FPC (по крайней мере, в win версии). Можно запускать только обычные функции.

Но ООП в дельфи/FPC была сделана по типу C++ с нарушением принципов ООП. Потом уже добавили возможность создания полноценного объекта в классическом понимании, но не убрали старый функционал. Что обычно никогда и не делается. Чтобы была возможность убрать имена классов из кода, компилятор должен создать таблицу в которой каждый тип, переменная, класс должен иметь соответствующий дескриптор. Ну и функционал переводящий одно в другое. Для доступа же к библиотеке снаружи, скорее всего, понадобится файл прототипа, указывающий на конструктор каждого класса.

Как я понимаю, имена классов описаны в таблице экспорта. И заменить их на более короткие проблематично из-за того, что при каждой компиляции они могут быть разные.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Уменьшение размера исполняемого файла

Сообщение vitaly_l » 24.10.2015 13:47:54

Лекс Айрин писал(а):Как я понимаю, имена классов описаны в таблице экспорта. И заменить их на более короткие проблематично из-за того, что при каждой компиляции они могут быть разные.

Ну и что? А зачем они одинаковые? Зачем программе вообще имена, если она пользуется адресами? (Вы же сами это предложили) Для внешних библиотек, можно делать ретранслятор из case например. Соответственно, имена - классов, функций, и т.д. программе ВООБЩЕ НЕНУЖНЫ, имена в программе это анахронизм.

Добавлено спустя 1 минуту 11 секунд:
Но какой смысл спорить, если это всё равно никто не реализует :cry:


.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: Уменьшение размера исполняемого файла

Сообщение Лекс Айрин » 24.10.2015 14:09:45

vitaly_l, имхо, имена нужны только при использовании динамических библиотек.

vitaly_l писал(а):Для внешних библиотек, можно делать ретранслятор из case например.


но нам же надо знать откуда/куда ретранслировать.

vitaly_l писал(а):Но какой смысл спорить, если это всё равно никто не реализует :cry:


Кто знает, кто знает. Возможно, эту тему сейчас читает человек, который сделает выводы и реализует что-то необходимое. Но, насколько я понимаю принципы, реально это не даст существенного уменьшения кода. Основной код это громадное количество неиспользуемого в программе функционала. Который компилятор (а точнее его оптимизатор) не может убрать.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Уменьшение размера исполняемого файла

Сообщение vitaly_l » 24.10.2015 14:28:18

Лекс Айрин писал(а):но нам же надо знать откуда/куда ретранслировать.

Так var стринги, то не удаляются... соответственно case и if всегда будут работать со своими стрингами,
и например, если имена классов в программе уже будут удалены, то при желании: класс можно найти принудительно, как-то так:

Код: Выделить всё
function someName(const dllClassName: string):boolean;
var classNameString: string;
begin
     classNameString := 'TНужныйНамКлассИзВнешнейDll';
     if (classNameString = dllClassName)
          then someName := true
          else someName := false;
end;


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


.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: Уменьшение размера исполняемого файла

Сообщение pupsik » 24.10.2015 14:36:40

Из всего сказанного у меня напрашивается вывод. Тяжесть приложения из-за поддержки нескольких систем + компиляция не "своим" средством.
Т.е. если бы был онли винда, или лин то и бинарники были бы легче. И, если использовать, собственный компилятор аналогично.
Или я не прав?
п.с.
Опускаю "мелочи". Просто интересует общий итог.
pupsik
энтузиаст
 
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13

Пред.След.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3

Рейтинг@Mail.ru