Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > размер проги


Автор: Dph 1.4.2004, 08:36
1. От чего зависить размер проги?
2. Как уменшить размер проги?
Хотя по моим статистикам
Delphi:
File-->New->Application EXE размер:300-400 Kb.
C++ Builder:
File-->New->Application EXE размер: 50 Kb
Assembler:
(invoke CreateWindow ) API EXE размер: 2Kb

Но я не знаю C++ и ASM !!!
Почему?



Автор: andrey_post 1.4.2004, 10:13
Если хочешь максимально уменьшить размер проги, то не включай в компиляцию всякие библиотеки и компоненты. Но, потом возникает беда, когда запускаещь это мальнькую прогу на другом компе, то СЮРПРАЙС! Она не рабит!. Что бы программа работала, надо включать все библиотеки и компоненты в нее, но кое-кокие вещи можно и не засовывать. Оптимизируй код, зделай его проще.

Автор: Jey_k 1.4.2004, 11:00
Dph
В опциях проекта Делфи есть функции по управлению размерами.
При максимальном уменьшении прога работает только на машинах с установленной Делфи версии не ниже чем та в которой разрабатывалась прога

Автор: DriveSoftware 2.4.2004, 08:57
Dph

Оптимальным вариантом думаю будет использование альтернативы VCL-у, это
KOL + MCK, размер пустого проекта 26kb

Автор: Serggggg 2.4.2004, 10:00
Также можно залезть в свойства компилятора и поотключать Debug-информацию и прочее.
Стоит действительно отметить, что Delphi пихает все библиотеки и модули в один exe-файл в отличие от С++ и Visual Basic. У нас в институте таким образом пострадало немало студентов - приносит человек в последний день курсовую, написанную на С++, а о том, чтобы принести ещё и библиотеки, необходимые для её запуска не подумал. Что делать? Домой - за dll'ками.
А если хочешь рационально использовать память - используй собственные dll, только используй динамическое их подгружениеб а не статическое.
Dph, на счет Asm ты загнул, конечно. Я очень уважаю этот язык. И немало строк на нем довелось написать. Но наваять на Asm'e, например, клиента для БД под Windows - это... ну, скажем так, весьма круто.
А вообще andrey_post абсолютно прав. Используй рациональные алгоритмы. Так что удачи в написании программ.

Автор: gepard 2.4.2004, 10:03
Есть специальные проги для сжатия *.exe'шников.

Автор: SlaUr 2.4.2004, 10:14
gepard
Цитата
Есть специальные проги для сжатия *.exe'шников

Может надо было в отдельную тему но ладно . Я где-то читал что упакованые Exeшники это не очень хорошо т.к. при запуске такого файла в память загружается упакованый и еще распакованный код или я не прав (мне этот вопрос очень интересен)

Автор: Serggggg 2.4.2004, 10:25
SlaUr, именно так. Это что-то типа архиватора. Только распаковка происходит уже непосредственно в RAM'e, а не в фоновом режиме с ProgressBar'ом, как у WinRar'a. На счет хорошо или не очень - не знаю - не пробовал ничего сжимать. А вот принцип именно такой.

Автор: gepard 2.4.2004, 11:13
Цитата
Может надо было в отдельную тему но ладно . Я где-то читал что упакованые Exeшники это не очень хорошо т.к. при запуске такого файла в память загружается упакованый и еще распакованный код или я не прав (мне этот вопрос очень интересен)

Я просто констатировал факт.

Автор: SlaUr 2.4.2004, 15:08
На счет упаковки-я делаю так : Если программа работает недолго - упаковываю Если программа работает в фоновом режиме или долго - не упаковываю.

Автор: serious 3.4.2004, 15:35
WinAPI рулит, размер файла - 8 кило. Аналогичная вещь на масме - 2 кило, ну если постараться, то 1.5

Автор: oleg1973 3.4.2004, 15:40
писать на чистом API и не мучится

Автор: Tamerlann 3.4.2004, 17:53
ИМХО писать на чистом API не каждый может с лёгкостью, а уж тем более когда дело касается больших проектов, а как правило именно их и пытаются ужать, они и без того здоровые.

И вопрос: я не знал про то что запакованные проги хранят в памяти две свои копии - запакованнуи и распакованную, но раз так, то я понимаю и быстродействие (во время ее выполнения) тоже должно страдать серьёзно? А как она загружается, тоже дольше?
Добавлено @ 17:55
Т.о. я считаю KOL и MCK - лучший выход в случае, когда нужно ужать программу.

Автор: зайка 3.4.2004, 18:51
Цитата(oleg1973 @ 3.4.2004, 16:40)
писать на чистом API и не мучится

А если прога межплатформенная?

Автор: oleg1973 3.4.2004, 21:02
Tamerlann
кто вам сказал про 2 копии?
я видел в инете гдето бредовую статейку на эту тему
возьмите исходники UPX да и посматрите

Автор: pascal 4.4.2004, 01:40
Цитата
А если прога межплатформенная?

Ну чуть сложнее будет, а так никаких ограничений...

Автор: NiJazz 4.4.2004, 08:58
Цитата
File-->New->Application EXE размер:300-400 Kb.
C++ Builder:

Просто в билдере по умалчанию установка есть не подклчать VCL в exe-файл. Из-за этого ехе меньше по размеру, но на машине без VCL эта программа работать не будет. В Delphi тоже можно так сделать: Project -> Options -> Packages -> Buld With Runtime Packages. Поставь галочку, если хочешь малые ехе -файлы.

Некоторые простые окошки можно создавать с помощью CreateWindow. Это сложнее в плане программирования, но зато сэкономит место и работать будет быстрее. Удачи!

Автор: PILOT 4.4.2004, 13:43
Вот программа, exe которой весит 16кБ.
Код

program testwindow;

uses
 Windows,
 Messages;

var
 WinClass: TWndClassA;
 Inst, Handle, Button1, Label1, Edit1: Integer;
 Msg: TMsg;
 hFont: Integer;

{ Checks if typed password is 'Amigreen' and shows Message }
procedure CheckPassword;
var
 Textlength: Integer;
 Text: PChar;
begin
 TextLength := GetWindowTextLength(Edit1);
 if TextLength = 8 then
 begin
   GetMem(Text, TextLength + 1);
   GetWindowText(Edit1, Text, TextLength + 1);
   if Text = 'Amigreen' then
   begin
     MessageBoxA(Handle, 'Password is correct.', 'Password check', MB_OK);
     FreeMem(Text, TextLength + 1);
     Exit;
   end;
 end;
 MessageBoxA(Handle, 'Password is incorrect.', 'Password check', MB_OK);
end;

{ Custom WindowProc function }
function WindowProc(hWnd, uMsg, wParam, lParam: Integer): Integer; stdcall;
begin
 Result := DefWindowProc(hWnd, uMsg, wParam, lParam);
 { Checks for messages }
 if (lParam = Button1) and (uMsg = WM_COMMAND) then
   CheckPassword;
 if uMsg = WM_DESTROY then
   Halt;
end;

begin
 { ** Register Custom WndClass ** }
 Inst := hInstance;
 with WinClass do
 begin
   style              := CS_CLASSDC or CS_PARENTDC;
   lpfnWndProc        := @WindowProc;
   hInstance          := Inst;
   hbrBackground      := color_btnface + 1;
   lpszClassname      := 'AG_TESTWINDOW';
   hCursor            := LoadCursor(0, IDC_ARROW);
 end; { with }
 RegisterClass(WinClass);

 { ** Create Main Window ** }
 Handle := CreateWindowEx(WS_EX_WINDOWEDGE, 'AG_TESTWINDOW', 'Amigreen TestWindow 1.00',
                          WS_VISIBLE or WS_SIZEBOX or WS_CAPTION or WS_SYSMENU,
                          363, 278, 305, 65, 0, 0, Inst, nil);
 { ** Create a button ** }
 Button1 := CreateWindow('Button', 'OK', WS_VISIBLE or WS_CHILD or BS_PUSHLIKE or BS_TEXT,
                          216, 8, 75, 25, handle, 0, Inst, nil);
 { ** Create a label (static) ** }
 Label1 := Createwindow('Static', '', WS_VISIBLE or WS_CHILD or SS_LEFT,
              8, 12, 76, 13, Handle, 0, Inst, nil);

 { ** Create an edit field ** }
 Edit1 := CreateWindowEx(WS_EX_CLIENTEDGE, 'Edit', '', WS_CHILD or WS_VISIBLE or
                         WS_BORDER or ES_PASSWORD, 88, 8, 121, 21, Handle, 0, Inst, nil);

 { ** Create Font Handle ** }
 hFont := CreateFont(-11, 0, 0, 0, 400, 0, 0, 0, DEFAULT_CHARSET,
                     OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
                     DEFAULT_PITCH or FF_DONTCARE, 'MS Sans Serif');

 { Change fonts }
 if hFont <> 0 then
 begin
   SendMessage(Button1, WM_SETFONT, hFont, 0);
   SendMessage(Label1, WM_SETFONT, hFont, 0);
   SendMessage(Edit1, WM_SETFONT, hFont, 0);
 end;
 { Change label (static) text }
 SetWindowText(Label1, 'Enter password:');
 { Set the focus to the edit control }
 SetFocus(Edit1);

 UpdateWindow(Handle);

 { ** Message Loop ** }
 while(GetMessage(Msg, Handle, 0, 0)) do
 begin
   TranslateMessage(msg);
   DispatchMessage(msg);
 end; { with }
end.


СУВ.
ЗЫ. я иногда пользуюсь UPX, но упакованные этой утилитой программы вызывают пристальное внимание программ антивирусов (это выражается в очень долгом запуске программы при включенном сканировании всех запускаемых программ программой-антивирусом).


Автор: SlaUr 8.4.2004, 08:37
насчет упаковки:может правда держание в памяти нераспакованной версии программы это только миф.

Вот провел тестик

Хотя занимаемую программой память я смотрел просто в XP (ctrl-alt-del\процессы) и тест возможно не отражает точные факты.

Программа/Упакованная версия/неупакованная версия

Несложный проект /2952 / 2920
Только форма без vcl /1940/1900

т.е. разница все же есть но не существенная.

p.s.упаковывал Aspackом


Автор: -=::BlackCat::=- 6.6.2004, 14:55
Цитата
Цитата(oleg1973 @ 3.4.2004, 16:40)
писать на чистом API и не мучится

А если прога межплатформенная?

что ты под этим подразумеваешь????

Автор: Medved 6.6.2004, 17:00
Вот, прочитай эту статью, и не терзай себя по напрасну http://russian.joelonsoftware.com/Articles/StrategyLetterIV.html

Но проги желательно сжимать http://www.pegas.mylawsite.net/soft/utils.htm

Автор: Albinos_x 6.6.2004, 23:10
Делай выбор между производительностью и объемом программы. Побольше пользуйся API, по меньше используй картинки вставленные в программу, не включай инфоверсию и не забывай про оптимизацию кода при завершении проекта.

Автор: -=::BlackCat::=- 6.6.2004, 23:27
по второй сылке фигня какая-то открывается sad.gif

Автор: Medved 6.6.2004, 23:49
Цитата
по второй сылке фигня какая-то открывается sad.gif

Не могли бы Вы обяснить поподробнее, что Вы подразумеваете под словом "фигня"?

Автор: Albinos_x 7.6.2004, 19:21
Цитата

по второй сылке фигня какая-то открывается


????

Автор: -=::BlackCat::=- 8.6.2004, 20:51
http://www.web1000.com/

Hostingservice

Автор: Monty 8.6.2004, 21:23
Цитата
http://www.web1000.com/

Hostingservice

Pegas, хоть ж*пу рви, а не открывается smile.gif ... сим-сим я тоже пробовал smile.gif ....

Автор: Enflout 9.6.2004, 13:41
А у меня открывается smile.gif

Автор: Guest 9.6.2004, 14:05
А мне прокся говорит Ая-Яй

Автор: Dr.Death 9.6.2004, 14:11
Если дело в размере, то я использую Aspack

Автор: Monty 9.6.2004, 16:13
То что уходив в публику я не пакую взломанными программами smile.gif ... да и UPX лучше сжимает smile.gif ...... а вот почему вы сжимаете AsPack'ом? smile.gif

Автор: YURIC 11.6.2004, 11:18
Юзай, размер проги уменьшается ощутимо

http://brsk.com.ru/cgi-bin/brskpub/pub.cgi?a=w&ID=412


Автор: devmstr 11.6.2004, 14:47
WinApi rulez.

Если несколько прог, то можешь поставлять в месте с программой библитотеки -200-300 KB.[s]
Исполняемые файлы, тогда весят очень мало. Если две - три проги - экономия на лицо. При поставке программы желательно использовать стандартный InstallShild (но не тот что поставляеться с 7 Delphi, там сжатия вообще почти нет, скорее наоборот). Он прекрасно знает слабые места Delphi и очень хорошо сжимает проги.

Автор: devmstr 11.6.2004, 15:31
WinApi Rulez

Автор: FreeNUX 12.6.2004, 17:12
Легче просто большие проекты на С писать, ну и конечно использовать WinApi функции.

Автор: Cheba 12.6.2004, 18:32
Цитата
Легче просто большие проекты на С писать
Ну да, конечно. Вы там создаете проекты с использованием ATL и MFC. А кто смотрел сколько они занимаеют? Вот буквально вчера сотрудник мне библиотечку одну дал (писаную на С), чтоб я ее прикрутил к проекту. Маленькая библиотечка была - 14 КБ. А когда на моей машине попробовали запустить она попросила одну MFC-шную библиотеку. Скопировали. Запускаем - просит другую. Скопировали и ее. Опять запускаем - еще просит. Дали. Успокоилась. Но мы как посмотрели сколько это добро занимает... 1.8 МБ!!!. Вот так он, этот С, рулит?

Автор: Medved 14.6.2004, 13:37
Цитата(magician @ 11.6.2004, 18:31)
WinApi Rulez

Рулез, рулез, я согласен, да только пока вы напишите 1 прогу на WinApi, я напишу уже 10 средствами Delphi. В итоге вы напишите 1 маленькую программу, и получите за нее ну скажем 2000$, а я напишу 10 но больших, и продам по той же цене (итого 2000$x10 = 20 000$). Да WinAPi это круто, я согласен....

Автор: oleg1973 14.6.2004, 15:17
Цитата
пока вы напишите 1 прогу на WinApi, я напишу уже 10 средствами Delphi

откуда такие данные?
или имеется ввиду "набросать на форму" ? smile.gif

Автор: Medved 15.6.2004, 06:38
Из личного опыта. Я имею ввиду чистый WinApi. Т.е. написать прогу используя только WinApi, и ничего более.

Автор: oleg1973 15.6.2004, 09:36
ну я в дельфи не силен
к примеру на апи CreateFile.... и так далее открываем файл
ReadFile .... читаем
в дельфи что будут коренные отличия?

Автор: Medved 15.6.2004, 10:59
Это с первого взгляду кажется, что отличий нет. А вот если стоит задача написать серьезное трехзвенное приложение, корпоративного уровня, которое будет работать с удаленной БД....

Я смотрю на этот вопрос с точки зрения написания больших и мощных информационных систем, а не ваяния различных утилиток.

Автор: stab 15.6.2004, 21:55
Цитата(Cheba @ 12.6.2004, 15:32)
Цитата
Легче просто большие проекты на С писать
Ну да, конечно. Вы там создаете проекты с использованием ATL и MFC. А кто смотрел сколько они занимаеют? Вот буквально вчера сотрудник мне библиотечку одну дал (писаную на С), чтоб я ее прикрутил к проекту. Маленькая библиотечка была - 14 КБ. А когда на моей машине попробовали запустить она попросила одну MFC-шную библиотеку. Скопировали. Запускаем - просит другую. Скопировали и ее. Опять запускаем - еще просит. Дали. Успокоилась. Но мы как посмотрели сколько это добро занимает... 1.8 МБ!!!. Вот так он, этот С, рулит?

если постараться то на VC++ можно свести размер пустого exe к 1.5 Кб, но это опять же писать на WinAPI smile.gif что больше всего меня растроило в VC++ (в плане оптимизации по размеру кода) так это следующая строчка:

Код

float a = 0.1f;


которая тут же увеличивает размер приложения на 40 Кб ... грустно sad.gif

з.ы. за офтоп ногами не бить... накипело
Добавлено @ 21:59
... использование любого класса +100 Кб sad.gif гадость

Автор: S.A.P. 19.6.2004, 13:59
А по конкретнее? Никаких функций по управлению размерами я не нашел. Как отключить лишние модули? baaa.gif

Автор: S.A.P. 19.6.2004, 14:10
Цитата(andrey_post @ 1.4.2004, 10:13)
Если хочешь максимально уменьшить размер проги, то не включай в компиляцию всякие библиотеки и компоненты. Но, потом возникает беда, когда запускаещь это мальнькую прогу на другом компе, то СЮРПРАЙС! Она не рабит!. Что бы программа работала, надо включать все библиотеки и компоненты в нее, но кое-кокие вещи можно и не засовывать. Оптимизируй код, зделай его проще.

А где я могу отключить лишние модули? В настройках ничего не нашел.

Автор: stab 20.6.2004, 22:28
Perchilla, на сколько я понял разговор про это: Project -> Options -> Packages, выставить галочку "Build with runtime packages".

Автор: ~FoX~ 21.6.2004, 14:55
Хех biggrin.gif
А я вообще не понимаю о чем разговор.
Ну да проги не маленькие, но с нынешними средствами коммуникаций, размерами винтов, всяких флешек и т.д. По моему это уж совсем не принципиально и тем более не критично!

Ну пожалуста, хотите маленькую прогу с большим гемороем? Берите АСМ и кропайте, берити Си и используйте только АПИ.
Обсалютно согласен с пегасом:
Цитата

Рулез, рулез, я согласен, да только пока вы напишите 1 прогу на WinApi, я напишу уже 10 средствами Delphi. В итоге вы напишите 1 маленькую программу, и получите за нее ну скажем 2000$, а я напишу 10 но больших, и продам по той же цене (итого 2000$x10 = 20 000$). Да WinAPi это круто, я согласен....

Хотя и от АПИ отказываться целиком не вариант! biggrin.gif

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)