IPB
ЛогинПароль:

> Правила раздела!

1. Заголовок или название темы должно быть информативным !
2. Все тексты фрагментов программ должны помещаться в теги [code] ... [/code] или [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ" и используйте ПОИСК !
4. НЕ используйте форум для личного общения!
5. Самое главное - это раздел теоретический, т.е. никаких задач и программ (за исключением небольших фрагментов) - для этого есть отдельный раздел!

2 страниц V  1 2 >  
 Ответить  Открыть новую тему 
> Уменьшение размера программ, способы, советы
сообщение
Сообщение #1


Ищущий истину
******

Группа: Пользователи
Сообщений: 4 825
Пол: Мужской
Реальное имя: Олег

Репутация: -  45  +


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


--------------------
Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Смотрю...
*****

Группа: Пользователи
Сообщений: 1 055
Пол: Мужской
Реальное имя: Пшеничный Алексей Анатольевич

Репутация: -  6  +


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


--------------------
Если что-то не делает того, что вы запланировали ему делать - это еще не означает, что оно бесполезно.
--------------------
Прежде, чем задать вопрос - Правила :: FAQ :: Поиск
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


...
*****

Группа: Пользователи
Сообщений: 1 347
Пол: Мужской

Репутация: -  3  +


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

А то определять переменную для цикла в диапазоне [-32768..32767] или более просто не разумно!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Четыре квадратика
****

Группа: Пользователи
Сообщений: 579
Пол: Мужской

Репутация: -  4  +


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

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

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

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

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


--------------------
Закон добровольного труда Зимерги:
Люди всегда согласны сделать работу, когда необходимость в этом уже отпала
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Прогрессор
****

Группа: Пользователи
Сообщений: 602
Пол: Мужской
Реальное имя: Михаил

Репутация: -  9  +


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


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

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


Четыре квадратика
****

Группа: Пользователи
Сообщений: 579
Пол: Мужской

Репутация: -  4  +


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


--------------------
Закон добровольного труда Зимерги:
Люди всегда согласны сделать работу, когда необходимость в этом уже отпала
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Профи
****

Группа: Пользователи
Сообщений: 930
Пол: Мужской

Репутация: -  11  +


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

Сообщение отредактировано: SKVOZNJAK -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Ищущий истину
******

Группа: Пользователи
Сообщений: 4 825
Пол: Мужской
Реальное имя: Олег

Репутация: -  45  +


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


--------------------
Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Четыре квадратика
****

Группа: Пользователи
Сообщений: 579
Пол: Мужской

Репутация: -  4  +


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


--------------------
Закон добровольного труда Зимерги:
Люди всегда согласны сделать работу, когда необходимость в этом уже отпала
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Ищущий истину
******

Группа: Пользователи
Сообщений: 4 825
Пол: Мужской
Реальное имя: Олег

Репутация: -  45  +


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


--------------------
Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Бывалый
***

Группа: Пользователи
Сообщений: 180
Пол: Мужской

Репутация: -  2  +


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

Сообщение отредактировано: P@sh@ -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12


Пионер
**

Группа: Пользователи
Сообщений: 119
Пол: Мужской

Репутация: -  0  +


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

Оптимизировать что? Для простейших логических операций потребуется намного больше пямяти (для хранения кода) и времени выполнения.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #13


Прогрессор
****

Группа: Пользователи
Сообщений: 602
Пол: Мужской
Реальное имя: Михаил

Репутация: -  9  +


Почему больше памяти? Имелось в виду хранить boolean не байтово, а битово.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #14


Ищущий истину
******

Группа: Пользователи
Сообщений: 4 825
Пол: Мужской
Реальное имя: Олег

Репутация: -  45  +


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


--------------------
Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #15


Бывалый
***

Группа: Пользователи
Сообщений: 180
Пол: Мужской

Репутация: -  2  +


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


Ищущий истину
******

Группа: Пользователи
Сообщений: 4 825
Пол: Мужской
Реальное имя: Олег

Репутация: -  45  +


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


--------------------
Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #17


Четыре квадратика
****

Группа: Пользователи
Сообщений: 579
Пол: Мужской

Репутация: -  4  +


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


--------------------
Закон добровольного труда Зимерги:
Люди всегда согласны сделать работу, когда необходимость в этом уже отпала
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #18


Ищущий истину
******

Группа: Пользователи
Сообщений: 4 825
Пол: Мужской
Реальное имя: Олег

Репутация: -  45  +


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

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

Сообщение отредактировано: Oleg_Z -


--------------------
Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #19


Смотрю...
*****

Группа: Пользователи
Сообщений: 1 055
Пол: Мужской
Реальное имя: Пшеничный Алексей Анатольевич

Репутация: -  6  +


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

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


--------------------
Если что-то не делает того, что вы запланировали ему делать - это еще не означает, что оно бесполезно.
--------------------
Прежде, чем задать вопрос - Правила :: FAQ :: Поиск
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #20


Пионер
**

Группа: Пользователи
Сообщений: 84
Пол: Мужской

Репутация: -  2  +


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


--------------------
* Origin: "It's MY LIFE!!! © Jhon Bon Jovi"
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

2 страниц V  1 2 >
 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 30.09.2020 14:22
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name