| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Общие вопросы > Уменьшение размера программ |
| Автор: Alexeis 6.2.2006, 18:34 | ||
Это класический пример простейшей windows програмы с одним главным окном. Под микроприложениями я понимаю узкоспециализированные програмки специального назначения или например фоновые приложения или утилитки запустил и выбросил, тестовые програмки тоже типа запустил и выбросил. Если писать на 450 - 500 кб - то такие программы качаются сравнительно долго. Кроме того VCL работает медленно, иногда нужно ультрабыструю чтоб не мешала даже на P133. Вот и подозрительно если код больше может и работает такая штука медленне... Ладно погоняю сам может что нибудь и узнаю просто думал вдруг кто в курсе Добавлено @ 18:36 Snowy как??? KOL дает от 40 кБ и под 2006 вроде не работает |
| Автор: _hunter 6.2.2006, 18:54 |
| смысла ( а точнее его прктическую ценность ) "классического приложения с одним окном" я не понимаю... запустил и выбросил... а какая разница сколько килобайт выкидывать?.. в корзину может не влезть? так и не надо... и откуда они качатся должны? насчет ультрабыстрости... -- тут звыняйте -- или скорость или рюшечки. и если нужна скорость -- пиши на API. я бы не сказал что тот-же Serv-U тормозит... |
| Автор: Alexeis 6.2.2006, 19:04 | ||||||
Смысл только в качестве теста
Из интернета конечно
Почему так страшно kol или acl работают почти так же быстро. Однако тот же апи компилируется разными версиями в разный код Вот это то и странно |
| Автор: _hunter 6.2.2006, 19:14 |
| т.е. смысла нет. ну две секунды разницы ( 4к ) -- очень заметная разница... API всегда компилируется в один и тот же код ( точнее его вызовы т.к. API уже скомпилирован ) а вот подготовка к вызову может отличатся... |
| Автор: Snowy 6.2.2006, 19:45 |
| Так я и говорю. Delphi7 + KOL + SysDcu7 Минимальная программа 5.6кб. Минимальная форма 15-17кб. Посмотри у меня в репе топик "Максимум минимизации". Там пример бесформенного приложения, размером 8кб, сидящего в трее и показывающего меню по клику. А также 10кб вариант с прикрученным к нему пингером. К слову, пример из FASM, сидящий в трее кушает ровно столько же памяти, сколько и мой, только ехе весит в 4 раза меньше. Почти? Если замерять, то KOL работает в разы быстрее. И ест в разы меньше памяти. |
| Автор: Snowy 6.2.2006, 21:20 |
| В D7 - 15 кило. 5.6 - минимально, что можно получить в дельфи без потери функциональности. Как я уже писал - прочитай эту тему: http://forum.vingrad.ru/index.php?showtopic=65035 А вообще минимальный размер проги на дельфи 3.5 кило, но вырезана вся функциональность. При необходимости можно и так, если устраивает прописывать все структуры и импортировать функции ручками. Но смысл? |
| Автор: bems 6.2.2006, 23:38 |
| Где-то читал такой вариант, но сам не прбовал (упаси Господь от этих извращений): пишется код на дельфи, пропускается через компилятор 3-й версии, и полученные obj-файлы окончательно компилятся MSVC во... Кто-нибудь хочет попробовать? |
| Автор: Alex 7.2.2006, 01:54 |
| Ребята, пишите на ASM еще компактней будет код... Среда растет, возможности тоже, слушать людей, которые видят разницу, что им скомпилили в 15 или 17 КБ мне просто смешно. Я сам все время борюсь за размер exe но до таких вещей вы уж простите никогда не опускался. Вы определитесь чего вы хотите удобную среду разработки или все ручками писать и создавать, получая маленькие объемы. Если руками, то ни как в толк не возьму, зачем вам Delphi? А если все же удобство разработки, так пора смириться с какими-то 10-50Кб и жить себе спокойно. И очень мне интересно, что за задачи у вас такие, где так важно написать ну прям крохотную программу, при этом нельзя воспользоваться упаковщиком? Мне за всю мою жизнь такое потребовалось только один раз кода программа должна была на диск в определенные места положить ряд файлов объемом 18Кб, сделать запись в реестре и ini файле. Вся программа с окном управления написанном на WinApi заняла у меня 86Кб. Грешно было просто делать форму и прогу в 300Кб для копирования 18Кб. А написали бы вы все это на Kol или еще чем-то ну вот добились вы не 86Кб как у меня, а 50 или 30, но это уже по мне не важно за то попрыгали бы в удовольствие при написании... |
| Автор: Snowy 7.2.2006, 10:12 |
| Alex, если речь идет о разработки проектов, то безусловно возиться с уменьшением размера нет смысла. Другое дело, если мы пишем фоновую программу, вроде шеддулера или сервиса. Такая программа должна кушать как можно меньше памяти. Кому нужен шеддулер, жрущий 20Мб? А сервисы, десяток которых съест всю оперативку? Речь как раз об этом. И упаковщик не решит проблему - он уменьшик ехешник, но не решит общую проблему. Кроме того никто от него и не отказывается. Программу в 25 кило можно ужать до 12. Что касается приложений с формами. Они оправданы, когда мы пишем небольшую программу. Но когда проект переваливает за 5-6 форм, то мы уже не особо и выигрываем размер, зато получаем массу проблем. Но до 5-6 форм мы имеем право выбрать целевой результат. У нас есть такая возможность, и, если нам это необходимо, мы можем ее использовать. А зачем? Уменьшится только размер ехешника, но не занимаемой памяти. Для мелких программ основной поедатель памяти - сама винда, которая создает объекты, кушающие память килобайтами. Да и разница для мелких проектов несущественна. Мы говорим не об обрезании возможностей, а о построении неVCL программ. В остальном они настолько же полнофункциональны. Все те же возможности у нас остаются. Причем, используя KOL у нас их даже больше. Добавлено @ 10:17 Модератор: оффтоп выделен в отдельную тему |
| Автор: Alexeis 15.2.2006, 17:41 |
| Простите долго не писал тема еще интересует все таки увеличение размера кода не VCL проекта более чем в два раза (в 2006 по сравнению с 7)связанно с компилятором или просто можно где то галочку (в настройках) поставить и исправить положение |
| Автор: Snowy 15.2.2006, 17:47 |
| Дело не в компиляторе. Просто с каждой новой версией, VCL обрастает новыми возможностями. Ты можешь о них вообще ничего не знать, но они все равно попадают в твой код. Больше возможностей - больше код. Поэтому многие вообще пишут на Delphi3 - там возможности VCL только базовые, зато ничего ненужного нет. KOL по другому обходит эту проблему - если ты не используешь какие-то возможности, то они вообще не попадают в код. Отсюда и размер в 20кб. |
| Автор: Alexeis 15.2.2006, 17:54 | ||
| да нет же Я писал
Добавлено @ 17:56 c vcl и так все понятно - чем дальше тем хуже но Api то чем виноват Добавлено @ 17:58 Именно api большой получается |
| Автор: Snowy 15.2.2006, 18:02 |
| А, ну тут разные вещи. Во-первых распух модуль System. Во-вторых используется новый менеджер памяти. В-третьих... Да мало ли что еще. |
| Автор: Snowy 16.3.2006, 12:56 |
| Хм. С максимальными извращениями получился файлик в 1405 байт. Дожимал буквально по байтику. Точнее по 20 байтиков. Меньше уже не получается. Это пример окна на дельфи. Оно ничего не делает, кроме стандартных действий (свернуть, развернуть, размер, положение и т.п.). Просто пример минимализма. |
| Автор: Alexeis 16.3.2006, 13:41 |
| Snowy, это на delphi 2006 ?? Добавлено @ 13:44 так это наверное модуль system урезан до предела? Чесно говоря в нем разобраться непросто |
| Автор: Snowy 16.3.2006, 13:50 |
| Нет конечно. Родная 7-ка - на ней самые маленькие неVCL файлы делаются. Он там вообще отсутствует и не нужно. Нужно убрать все, а потом добавлять потихоньку все, чего не хватает. |
| Автор: Alexeis 16.3.2006, 13:54 |
| Что вообще утежеляет модуль system? Сознание новых типов утяжеляет проект или нет ?(если они не используются) В этом смысле функции и константы не должны вроде. Глобальные переменные точно должны. Не использованные классы утяжеляют или нет? Раздел инициализации и финализации явно нужно переработать. Как всето таки его правельно резать чтобы лишнее (не утяжеляющее) не трогать? Добавлено @ 13:56 А как можно удалить вообще системные модули |
| Автор: Snowy 16.3.2006, 14:09 | ||||||||||
Все то же, что и другие модули.
Аналогично. Если не используются - нет. Оптимизатор все режет. Не режет он только методы классов, которые не используются, но используется сам класс. При использовании объектов, неиспользуемые методы тоже режутся.
System и SisInit удалить полностью нельзя. Но можно сделать их пустыми:
Правда пустой System не скомпилится. У меня он такой:
Добавлено @ 14:10 Это необходимый минимум для оконных программ. Для неоконных он еще меньше. В принципе все, что для оконных можно вынести в другой модуль. Добавлено @ 14:13 Вот минимальный System для неоконных приложений:
Добавлено @ 14:17 В принципе скомпиленный вариант будет почти одинаков. Мой вариант чуть больше из-за того, что вычисляет hInstance. То есть реально только на одну импортируемую функцию больше. |
| Автор: Alexeis 16.3.2006, 14:22 |
| Если компилятор все неиспользованное удаляет сам то по идее если убрать все написанное в разделах initialization и finalization и скомпилировать пустой проект то результат должен быть анологичным или я что-то упустил Добавлено @ 14:35 Кстати как компилятору явно указать что нужно использовать именно эти модули system и sysinit а не родные а то не всегда срабатывает помещение в ту же директорию. |
| Автор: Snowy 16.3.2006, 14:55 | ||
Не совсем. Еще нужно зачистить _HandleFinally, _InitExe, _halt0. Что нужно зачистить еще я не знаю. Но даже при таком раскладе разница больше килобайта. Каким-то макаром туда еще менеджер памяти попадает. Модуль System все же не совсем стандартный - есть в нем еще и внутрисистемные вызовы... Добавлено @ 14:56 Если в том же каталоге, то всегда. По крайней мере при компиляции из коммандной строки точно. По другому - через настройки проекта. |
| Автор: Alexeis 16.3.2006, 15:29 | ||
я в настройках не нахожу такую штуку |
| Автор: Snowy 16.3.2006, 15:53 |
| Это в настройках среды. Menu -> Tools -> Environment Options -> Library -> Library Path В настройках проекта просто вставь в список Search Path первым свой каталог. |
| Автор: Alexeis 16.3.2006, 16:00 |
| Snowy, в этом виде ни один из модулей delphi не воспринимает просто игнорирует. Добавлено @ 16:08 Выложи пожалуйста весь проект с исходниками. |
| Автор: Snowy 16.3.2006, 16:14 |
| У меня 7-ка спокойно компилит без указания каталогов. Просто бросил файлы в тот же каталог. Кстати, как обычно из самой дельфи размер получился больше, чем при компиляции из коммандной строки. Поэтому я всегда собираю батники для компиляции. А ты скомпилил System.pas? Или просто его туда бросил? Если не скомпилил, то дельфя их и не увидит. system.pas ей пофигу. Ей нужен system.dcu. |
| Автор: Alexeis 16.3.2006, 16:19 | ||
Разве можно это сделать без проекта?? Я так не умею Добавлено @ 16:20 Просто бросил System.pas |
| Автор: Snowy 16.3.2006, 16:27 |
| Выкладываю пакет для создания микропрограмм. В комплекте все необходимое, кроме самого компилятора и редактора ресурсов. В файле list.txt все файлы подписаны. Добавлено @ 16:28 Это можно сделать только без проекта: dcc32 -q system -m -y -z -$D- |
| Автор: Alexeis 16.3.2006, 16:48 |
| Snowy, Так там еще и отладочная информация удалена?? и наверно упакован, а то получается 3 кб. |
| Автор: Snowy 16.3.2006, 16:56 | ||
Естественно! В txt же все написано. И упаковщик в комплекте. А ты думал я рожу чудо и сделаю так, что компилятор дельфи будет строить прогу по другому? Нет. Я просто уменьшил код до минимума. В самом exe осталось полкило кода и куча пустоты. Вот эту пустоту мы и ликвидируем при помощи приложенных утилит. |
| Автор: Snowy 16.3.2006, 17:21 |
| Ставим рекорды. Помнится когда-то зашел разговор в религиозных войнах, что Delphi создает огромные ехешники. Тогда Решили написать HelloWorld на дельфи и на C++. Мой вариант получился 4096 байт. Размер на C++ составил 1024 байта. Теперь я готов дать новый ответ. Вот он. Hello World на дельфи. 1005 байт! Теперь можете смело ссылаться на этот пост, когда вам скажут, что на дельфи нельзя писать маленькие программы. |
| Автор: Snowy 16.3.2006, 17:24 |
| Извиняюсь. Недоработочка вышла. Ставим рекорды. Помнится когда-то зашел разговор в религиозных войнах, что Delphi создает огромные ехешники. Тогда Решили написать HelloWorld на дельфи и на C++. Мой вариант получился 4096 байт. Размер на C++ составил 1024 байта. Теперь я готов дать новый ответ. Вот он. Hello World на дельфи. 977 байт! Теперь можете смело ссылаться на этот пост, когда вам скажут, что на дельфи нельзя писать маленькие программы. |
| Автор: Yanis 16.3.2006, 18:00 | ||
Можно то можно, но путём всяческих извращений. Наверняка System кастрированый, что влечёт за собой множество неудобств. |
| Автор: Snowy 16.3.2006, 18:24 | ||
Главное неудобство - нельзя подключать стандартные модули. Но когда счет идет на байты, то это закономерно - все пишем ручками. А точнее собираем свой "стандартный" модуль, куда переносим необходимые нам куски стандартных - строгая ручная фильтрация - берем только то, что нам действительно нужно. Добавлено @ 18:26 Кстати, на масме Hello World из экзамплов получается 1.5кб. |
| Автор: Yanis 16.3.2006, 18:56 | ||
Опыт у меня небольшой, но я если честно немогу представить случая, когда счёт идёт на байты, а программист пишет на Delphi Конечно, там же вроде линкуются все функции, когда библиотеку, например подцепляешь. (Или нет? Не помню просто |
| Автор: Snowy 16.3.2006, 19:01 | ||||||
А теперь ради бога. Хочешь на дельфи - пажалиста. Что мешает-то? Если бы разговор шел о C++, то сомнений бы не было. Почему такие сомнения насчет дельфи? Все разумно.
Слеплено немного коряво, но ничего существенно лишнего нет.
При стандартной организации невозможно сделать ехе меньше килобайта. |
| Автор: Girder 22.3.2006, 15:35 | ||||
Открой блокнот... и в пеши в него две буковки: "лю". Сохрани под с любым именем и расширением "com"(т.е. Бла-бла.com) в кодировке ANSI. Все можеш запускать. PS: Вот тебе и приложение из 2 байт с окном которое также ни чего не умеет делать |
| Автор: Snowy 22.3.2006, 16:21 | ||
Только окно консольное. По DOS у меня рекорд 19 байт - программа с полноэкранной анимацией. А под Win32 не получится создать стандартный PE код меньше 1кб. Только нестандартный. А 977 байт для дельфи это весьма прилично. Да и не только для дельфи ;) |
| Автор: vlgr 28.9.2006, 14:53 |
| Если кому то еще интересно HelloWorld на Delphi без упаковки но с помощью unilink`а 730 байт minipad без упаковки, без дополнительных утилит, только Delphi 4608 байт |
| Автор: RA 8.4.2007, 21:03 |
| Компилятор D6, Пакер FSG 2.0 Новый рекорд 913 байт |
| Автор: Yanis 9.4.2007, 15:17 |
Совсем уж старая статья: http://xproger.mirgames.ru/?id=1&page=0&doc=delphi_min Заявлено меньше |
| Автор: Snowy 9.4.2007, 16:01 |
| Так там преобразование в com файл идёт. Нафига нам com? Добавлено через 1 минуту и 23 секунды Да и "прога" ничего не делает. А мы про HelloWorld говорим. |
| Автор: XProger 10.4.2007, 01:11 |
| Раз уж на то пошло... 896 б Компилятор Delphi 3. Линковщик Microsoft Linker. Никакого сжатия не применялось. |
| Автор: Yanis 10.4.2007, 09:13 | ||
Привет! Рад приветствовать на нашем форуме. Молодец, что ответил. Надеюсь не последний раз ;) |
| Автор: XProger 10.4.2007, 09:34 |
| Yanis, привет привет Как же я мог пройти мимо, когда тут такая родная для меня тема обсуждается ;) Посмотрим как (чем?) уменьшат текущий результат. Кстати, поигрался с настройками... 820 байт, опять же без сжатия. |
| Автор: RA 10.4.2007, 18:30 |
Вообще-то чем меньше версия компилятора тем меньше размер, так что это из другой весовой категории Добавлено через 2 минуты и 22 секунды D3 и D4 делают экстремально маленькие приложения даже по сравнению с D5 |
| Автор: XProger 10.4.2007, 18:33 |
| RA, категорически не согласен. Комилятор ничего лишнего в exe не добавляет от версии к версии. |
| Автор: ~FoX~ 10.4.2007, 18:39 |
| http://articles.org.ru/cfaq/index.php?qid=2571 |
| Автор: W1zArD 14.7.2007, 00:58 |
| конечно не знаю... надо или нет.. но вот: 512 байт ))) http://www.xakep.ru/local/search/result.asp?scope=+%22%2Fxpost%22%2C+%22%2Fmagazine%2Fxa%22%2C+%22%2Fmagazine%2Fxs%22%2C+%22%2Fmagazine%2Fxh%22+&orderby=rank&tosearch=Delphi+%E2%F1%E5%EC%EE%E3%F3%F9%E8%E9 читать именно то, где встречается "Delphi всемогущий" т.е. с 3-8... ой оказывается уже есть, но ссылку все равно оставлю... |
| Автор: RA 15.7.2007, 21:42 | ||
Дык не пробовал вот и не согласен. Попробуй и сам убедишься. |
| Автор: Alexeis 15.7.2007, 21:48 |
Не всегда. Пустая форма не всегда увеличивается от версии к версии. |
| Автор: ivan219 15.7.2007, 23:35 |
| А вот от обновления к обновлению точно покрайней мере в Delphi7 |
| Автор: RA 17.7.2007, 21:01 | ||||
Причем тут пустая форма, вот пример.
|
| Автор: Alexeis 17.7.2007, 21:57 |
| RA, что же из этого примера следует? |
| Автор: RA 18.7.2007, 20:27 |
В D4 один размер в D5 другой в D6 третий и тд. по нарастающей |
| Автор: Alexeis 18.7.2007, 20:38 |
А в семерке скорее всего меньше. |
| Автор: Snowy 18.7.2007, 21:55 |
| В D5 больше, чем в D7, в D3 больше чем в D5 и так по убывающей Хотя не могу не признать, что в D2007 больше, чем в D7. D7 вообще даёт самый маленький результат. Потому для микропрограмм её и юзаю... |
| Автор: Alexeis 18.7.2007, 21:58 |
Но не больше чем 2006. |
| Автор: Telepyz 20.7.2007, 13:53 |
| А UPX'ом пользоваться не пробовали))) |
| Автор: Alexeis 20.7.2007, 14:12 |
| UPX это зло, лучше 7-zipом. |
| Автор: Telepyz 20.7.2007, 15:25 |
Дану, зато потом прогу нельзя вскрыть редактором ресурсов)) |
| Автор: Alexeis 20.7.2007, 15:47 |
Во первых Restorator2006 поддерживает уже UPX, а во вторых делается банальный дамп процесса в памяти, после чего все ресурсы становятся доступны так как будто и не было ничего упаковано. |
| Автор: Telepyz 20.7.2007, 16:16 | ||
У меня Restorator2006 v.3.0 билд 1126 не поддерживает...(( |
| Автор: Snowy 20.7.2007, 18:20 |
| Ха-ха три раза... upx -d Project1.exe |