Уменьшение размера программ, способы, советы |
1. Заголовок или название темы должно быть информативным !
2. Все тексты фрагментов программ должны помещаться в теги [code] ... [/code] или [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ" и используйте ПОИСК !
4. НЕ используйте форум для личного общения!
5. Самое главное - это раздел теоретический, т.е. никаких задач и программ (за исключением небольших фрагментов) - для этого есть отдельный раздел!
Уменьшение размера программ, способы, советы |
Altair |
27.03.2004 15:26
Сообщение
#1
|
Ищущий истину Группа: Модераторы Сообщений: 4 824 Пол: Мужской Реальное имя: Олег Репутация: 45 |
после нескольких опытов обнаружил, что чем больше модулей прописанно в USES , тем больше программа, т.е компилятор компилирует весь модуль, независимо, от того, используются ли его процедуры. И еще при замене конструкции переменная:=переменная +1 на INC(переменная), размер программы сокращается на 6 байт.
Есть ли способы заметно сократить размер (процентов на 30-40)? -------------------- Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С) |
APAL |
27.03.2004 16:31
Сообщение
#2
|
Смотрю... Группа: Модераторы Сообщений: 1 055 Пол: Мужской Реальное имя: Пшеничный Алексей Анатольевич Репутация: 6 |
Самое очевидное - контролировать описание переменных.
Напр. если значение будет в пределах 0..255 то итспользовать тип Byte Тоже и со строками - ограничивать их длину еще при описании... -------------------- |
AlaRic |
28.03.2004 15:07
Сообщение
#3
|
... Группа: Пользователи Сообщений: 1 347 Пол: Мужской Репутация: 3 |
1. Используй кроме inc еще dec succ и др.
2. Советую вместо integer или longint описывать свой тип. Например: Код type mini:1..50; var a:mini; А то определять переменную для цикла в диапазоне [-32768..32767] или более просто не разумно! |
trminator |
28.03.2004 20:34
Сообщение
#4
|
Четыре квадратика Группа: Пользователи Сообщений: 579 Пол: Мужской Репутация: 4 |
Цитата type mini : 1..50 Нет смысла. Все равно выделится память 1 байт (type mini : byte) Кстати, я долго ржал, когда узнал, что boolean тоже 1 байт =) и 8 булеанов 8 байт =) могли бы оптимизировать А САМЫЙ лучший способ уменьшить размер программы (написанной на Паскале, т. е. асм не рассматриваем) -- не забыть убрать из нее отладочную информацию +) (просто, но я, например, всегда забываю =) Как я понимаю, в программу все-таки не вкомпилируется весь модуль. Возможно, в модуле описаны несколько (пара-тройка сотен) служебных переменных -- их описание вставляется. Дельфийскую прогу можно сжать, например, UPX'ом. Возможно, есть что-нибудь такое и под ДОС. -------------------- Закон добровольного труда Зимерги:
Люди всегда согласны сделать работу, когда необходимость в этом уже отпала |
Atos |
29.03.2004 6:54
Сообщение
#5
|
Прогрессор Группа: Модераторы Сообщений: 602 Пол: Мужской Реальное имя: Михаил Репутация: 9 |
Цитата Кстати, я долго ржал, когда узнал, что boolean тоже 1 байт Аналогично! А я ещё первое время пытался всюду ord(boolean) и 2*ord(boolean) писать, там, где удобней было просто 1, 2 или 0 bytовские... Кстати, в Паскали вроде бы есть механизм inline - процедур (сам не пробовал), которые могут убыстрить прогу, но существенно увеличить размер. |
trminator |
29.03.2004 19:51
Сообщение
#6
|
Четыре квадратика Группа: Пользователи Сообщений: 579 Пол: Мужской Репутация: 4 |
Насколько я помню, inline в Паскале -- вставка машинных кодов. inline-процедуры есть в Си (фактически вместо выхова процедуры просто вставляется кусок кода. ИМХО ускорение не такое уж и большое... хотя если только большой цикл...)
-------------------- Закон добровольного труда Зимерги:
Люди всегда согласны сделать работу, когда необходимость в этом уже отпала |
SKVOZNJAK |
29.03.2004 20:32
Сообщение
#7
|
Профи Группа: Пользователи Сообщений: 930 Пол: Мужской Репутация: 11 |
Проверил. Весь модуль Graph не может занимать 4 кило. Столько может занимать инициализационная часть модуля. Для экономии глобальных переменных можно побитово записывать информацию в массив BYTE. Тоже экономия, но не размера.
Сообщение отредактировано: SKVOZNJAK - 29.03.2004 20:35 |
Altair |
30.03.2004 8:47
Сообщение
#8
|
Ищущий истину Группа: Модераторы Сообщений: 4 824 Пол: Мужской Реальное имя: Олег Репутация: 45 |
Непонятен вопрос с модулями, если в строке USES прописан модуль, он весь компилируется, или только какоято часть от него (что - то точно компилируется,
иначе у меня не увеличивался бы размер ) --------------- Может быть не пользоваться модулями, а писать все процедуры в программе (так не будет лишнего)? -------------------- Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С) |
trminator |
30.03.2004 20:41
Сообщение
#9
|
Четыре квадратика Группа: Пользователи Сообщений: 579 Пол: Мужской Репутация: 4 |
Видимо, прикомпиливаются описания переменных, значения констант (типа цвет по умолчанию...) и, как сказал SKVOZNJAK, инициализационная часть -- действительно, возможно, при подключении этого модуля выполняется некая процеДУРА (секция initialization, если ни с чем не путаю)
-------------------- Закон добровольного труда Зимерги:
Люди всегда согласны сделать работу, когда необходимость в этом уже отпала |
Altair |
31.03.2004 7:38
Сообщение
#10
|
Ищущий истину Группа: Модераторы Сообщений: 4 824 Пол: Мужской Реальное имя: Олег Репутация: 45 |
Точно, теперь я понял - компилируется в модуле все, что после BEGIN
т.е. последняя часть модуля! ------- Теперь про FAR Оказывается, ближняя модель вызова (NEAR) экономит 1 байт и выполняется на несколько МИКРОСЕКУНД быстрее(т.е запуск процедуры проичходит быстрее) А в модуле по умолчанию интерфейстная часть компилируеться с расчетом на дальнюю. Надо попробовать написать модуль с процедурами NEAR -------------------- Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С) |
P@sh@ |
1.04.2004 9:03
Сообщение
#11
|
Бывалый Группа: Пользователи Сообщений: 180 Пол: Мужской Репутация: 2 |
модули в паскале всегда подключаются целиком и полностью, т.е. компилируются в TPU (DCU) отдельно, а не в составе вашей программы, а потом линкуются в один екзешник. Из-за этого и была придумана динамическая линковка: DLL/BPL. Они делаются точно так же, просто линкуются не в процессе сборки экзешника, а после его запуска, по запросу... Иначе виндозовские экзешники были бы просто охрененных размеров (десятки мегабайт, если использовать GUI, а кто его не использует?)
Сообщение отредактировано: P@sh@ - 1.04.2004 9:08 |
zx1024 |
3.04.2004 0:04
Сообщение
#12
|
Пионер Группа: Пользователи Сообщений: 119 Пол: Мужской Репутация: 0 |
Цитата Кстати, я долго ржал, когда узнал, что boolean тоже 1 байт =) и 8 булеанов 8 байт =) могли бы оптимизировать Оптимизировать что? Для простейших логических операций потребуется намного больше пямяти (для хранения кода) и времени выполнения. |
Atos |
3.04.2004 9:07
Сообщение
#13
|
Прогрессор Группа: Модераторы Сообщений: 602 Пол: Мужской Реальное имя: Михаил Репутация: 9 |
Почему больше памяти? Имелось в виду хранить boolean не байтово, а битово.
|
Altair |
3.04.2004 13:18
Сообщение
#14
|
Ищущий истину Группа: Модераторы Сообщений: 4 824 Пол: Мужской Реальное имя: Олег Репутация: 45 |
Да, с boolean у разработчиков как-то не вышло, его даже лучше и не использовать!
(заменять на byte - 1 =true, 0=false) -------------------- Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С) |
P@sh@ |
7.04.2004 5:21
Сообщение
#15
|
Бывалый Группа: Пользователи Сообщений: 180 Пол: Мужской Репутация: 2 |
зачем заменять его на байт, если это и так байт, и именно с этими же значениями...
я, например, бывает, использую такую конструкцию: sign:=integer(x>0)-integer(x<0); {аналог функции SGN в бейсике} |
Altair |
7.04.2004 6:46
Сообщение
#16
|
Ищущий истину Группа: Модераторы Сообщений: 4 824 Пол: Мужской Реальное имя: Олег Репутация: 45 |
>>>зачем заменять его на байт, если это и так байт, и именно с этими же значениями...
---- Если его заменить (boolean на byte) то эту переменную можно будет в программе использовать еще! (в целях экономии памяти) -------------------- Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С) |
trminator |
7.04.2004 20:26
Сообщение
#17
|
Четыре квадратика Группа: Пользователи Сообщений: 579 Пол: Мужской Репутация: 4 |
Все-таки лучше оставить boolean =) [ if a ] читается намного легче, чем [ if a >= 1 ]. А главное в коде часто не экономия пары-тройки байт, а экономия пары-тройки минут на его чтение человеком (ИМХО)
-------------------- Закон добровольного труда Зимерги:
Люди всегда согласны сделать работу, когда необходимость в этом уже отпала |
Altair |
8.04.2004 13:56
Сообщение
#18
|
Ищущий истину Группа: Модераторы Сообщений: 4 824 Пол: Мужской Реальное имя: Олег Репутация: 45 |
Цитата А главное в коде часто не экономия пары-тройки байт, а экономия пары-тройки минут на его чтение человеком (ИМХО) trminator, согласен. Я вот еще что придумал: 1)Вместо массивов использовать списки! (не надо сразу резервировать место в паяти, а если будет переполнения, то все скидывать в файл, и стирать список, и т.д.) 2) Вместо string использовать тоже список (он кажется есть в TP - PChar !) - то же самое - ведь никогда не знаешь, сколько надо резервировать символов под строку (некоторые просто пишут string, резервируя сразу 256 байт(КОШМАР ) Я вот видел своими глазами эмулятор померхности марса (написан в1985)весит всего 4 кб!!!!! + там мышь используется!!!! (вот это профи писали, не то, что windows - 300 мб г***а! ) Сообщение отредактировано: Oleg_Z - 8.04.2004 13:58 -------------------- Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С) |
APAL |
8.04.2004 14:38
Сообщение
#19
|
Смотрю... Группа: Модераторы Сообщений: 1 055 Пол: Мужской Реальное имя: Пшеничный Алексей Анатольевич Репутация: 6 |
Цитата(Oleg_Z @ 8.04.04 10:56) Я вот видел своими глазами эмулятор померхности марса (написан в1985)весит всего 4 кб!!!!! + там мышь используется!!!! Насколько я помню, я тоже это видел или нечто подобное... -------------------- |
CJ |
12.04.2004 22:43
Сообщение
#20
|
Пионер Группа: Пользователи Сообщений: 84 Пол: Мужской Репутация: 2 |
Не вникал в разговор, помню мне кто-то говорил на расвете программерской жизни, что уменьшить немного размер проги так, можно например использовать вместо типа integer тип shortint, и тому подобное.
-------------------- * Origin: "It's MY LIFE!!! © Jhon Bon Jovi"
|
Текстовая версия | 29.04.2024 20:50 |