Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Теоретические вопросы _ Уменьшение размера программ

Автор: Altair 27.03.2004 19:26

после нескольких опытов обнаружил, что чем больше модулей прописанно в USES , тем больше программа, т.е компилятор компилирует весь модуль, независимо, от того, используются ли его процедуры. И еще при замене конструкции переменная:=переменная +1 на INC(переменная), размер программы сокращается на 6 байт.
Есть ли способы заметно сократить размер (процентов на 30-40)?

Автор: APAL 27.03.2004 20:31

Самое очевидное - контролировать описание переменных.
Напр. если значение будет в пределах 0..255 то итспользовать тип Byte
Тоже и со строками - ограничивать их длину еще при описании...

Автор: AlaRic 28.03.2004 19:07

1. Используй кроме inc еще dec succ и др.
2. Советую вместо integer или longint описывать свой тип.
Например:

Код
type mini:1..50;
var a:mini;

А то определять переменную для цикла в диапазоне [-32768..32767] или более просто не разумно!

Автор: trminator 29.03.2004 0:34

Цитата
type mini : 1..50

Нет смысла. Все равно выделится память 1 байт (type mini : byte)
Кстати, я долго ржал, когда узнал, что boolean тоже 1 байт =) и 8 булеанов 8 байт =) могли бы оптимизировать

А САМЫЙ лучший способ уменьшить размер программы (написанной на Паскале, т. е. асм не рассматриваем) -- не забыть убрать из нее отладочную информацию +) (просто, но я, например, всегда забываю =)

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

Дельфийскую прогу можно сжать, например, UPX'ом. Возможно, есть что-нибудь такое и под ДОС.

Автор: Atos 29.03.2004 10:54

Цитата
Кстати, я долго ржал, когда узнал, что boolean тоже 1 байт


Аналогично! А я ещё первое время пытался всюду ord(boolean) и 2*ord(boolean) писать, там, где удобней было просто 1, 2 или 0 bytовские...

Кстати, в Паскали вроде бы есть механизм inline - процедур (сам не пробовал), которые могут убыстрить прогу, но существенно увеличить размер.

Автор: trminator 29.03.2004 23:51

Насколько я помню, inline в Паскале -- вставка машинных кодов. inline-процедуры есть в Си (фактически вместо выхова процедуры просто вставляется кусок кода. ИМХО ускорение не такое уж и большое... хотя если только большой цикл...)

Автор: SKVOZNJAK 30.03.2004 0:32

Проверил. Весь модуль Graph не может занимать 4 кило. Столько может занимать инициализационная часть модуля. Для экономии глобальных переменных можно побитово записывать информацию в массив BYTE. Тоже экономия, но не размера.

Автор: Altair 30.03.2004 12:47

Непонятен вопрос с модулями, если в строке USES прописан модуль, он весь компилируется, или только какоято часть от него (что - то точно компилируется,
иначе у меня не увеличивался бы размер )
---------------
Может быть не пользоваться модулями, а писать все процедуры в программе
(так не будет лишнего)?

Автор: trminator 31.03.2004 0:41

Видимо, прикомпиливаются описания переменных, значения констант (типа цвет по умолчанию...) и, как сказал SKVOZNJAK, инициализационная часть -- действительно, возможно, при подключении этого модуля выполняется некая процеДУРА (секция initialization, если ни с чем не путаю)

Автор: Altair 31.03.2004 11:38

Точно, теперь я понял - компилируется в модуле все, что после BEGIN
т.е. последняя часть модуля!
-------
Теперь про FAR
Оказывается, ближняя модель вызова (NEAR) экономит 1 байт и выполняется на несколько МИКРОСЕКУНД быстрее(т.е запуск процедуры проичходит быстрее) А в модуле по умолчанию интерфейстная часть компилируеться с расчетом на дальнюю. Надо попробовать написать модуль с процедурами NEAR

Автор: P@sh@ 1.04.2004 13:03

модули в паскале всегда подключаются целиком и полностью, т.е. компилируются в TPU (DCU) отдельно, а не в составе вашей программы, а потом линкуются в один екзешник. Из-за этого и была придумана динамическая линковка: DLL/BPL. Они делаются точно так же, просто линкуются не в процессе сборки экзешника, а после его запуска, по запросу... Иначе виндозовские экзешники были бы просто охрененных размеров (десятки мегабайт, если использовать GUI, а кто его не использует?)

Автор: zx1024 3.04.2004 4:04

Цитата
Кстати, я долго ржал, когда узнал, что boolean тоже 1 байт =) и 8 булеанов 8 байт =) могли бы оптимизировать

Оптимизировать что? Для простейших логических операций потребуется намного больше пямяти (для хранения кода) и времени выполнения.

Автор: Atos 3.04.2004 13:07

Почему больше памяти? Имелось в виду хранить boolean не байтово, а битово.

Автор: Altair 3.04.2004 17:18

Да, с boolean у разработчиков как-то не вышло, его даже лучше и не использовать!
(заменять на byte - 1 =true, 0=false)

Автор: P@sh@ 7.04.2004 9:21

зачем заменять его на байт, если это и так байт, и именно с этими же значениями...
я, например, бывает, использую такую конструкцию:
sign:=integer(x>0)-integer(x<0); {аналог функции SGN в бейсике}

Автор: Altair 7.04.2004 10:46

>>>зачем заменять его на байт, если это и так байт, и именно с этими же значениями...
----
Если его заменить (boolean на byte) то эту переменную можно будет в программе использовать еще!
(в целях экономии памяти)

Автор: trminator 8.04.2004 0:26

Все-таки лучше оставить boolean =) [ if a ] читается намного легче, чем [ if a >= 1 ]. А главное в коде часто не экономия пары-тройки байт, а экономия пары-тройки минут на его чтение человеком (ИМХО)

Автор: Altair 8.04.2004 17:56

Цитата
А главное в коде часто не экономия пары-тройки байт, а экономия пары-тройки минут на его чтение человеком (ИМХО)

trminator, согласен.
Я вот еще что придумал:
1)Вместо массивов использовать списки! (не надо сразу резервировать место в паяти, а если будет переполнения, то все скидывать в файл, и стирать список, и т.д.)
2) Вместо string использовать тоже список (он кажется есть в TP - PChar !) -
то же самое - ведь никогда не знаешь, сколько надо резервировать символов под строку (некоторые просто пишут string, резервируя сразу 256 байт(КОШМАР rolleyes.gif )
Я вот видел своими глазами эмулятор померхности марса (написан в1985)весит всего 4 кб!!!!! + там мышь используется!!!! (вот это профи писали, не то, что windows - 300 мб г***а! smile.gif )

Автор: APAL 8.04.2004 18:38

Цитата(Oleg_Z @ 8.04.04 10:56)
Я вот видел своими глазами эмулятор померхности марса (написан в1985)весит всего 4 кб!!!!! + там мышь используется!!!!

Насколько я помню, я тоже это видел или нечто подобное...

Автор: CJ 13.04.2004 2:43

Не вникал в разговор, помню мне кто-то говорил на расвете программерской жизни, что уменьшить немного размер проги так, можно например использовать вместо типа integer тип shortint, и тому подобное.

Автор: Altair 13.04.2004 10:33

Да, только не всегда это позволяет программа.
И мы это сразу обозначили.
Кстати вот еще, что я отрыл в горах учебников:
Использование shr и shl заменяет умножения на 2 в любой степенни,
т.е. надо просто разный сдвиг использовать в зависимости от степени.
"Это сильно уменьшит размер программы" (сильно - это по меркам 1985 года - байта на 3 думаю).