PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : exe Größe



blue lord
12.08.2004, 23:45
Mir ist aufgefallen, dass die exen der Programme, die ich mit Dev-C++ erstellt habe 1,21 MB groß sind und die gleichen Programme, wenn ich sie mit Microsoft Visual C++ 6.0 erstellt habe nur ein paar kb.

Warum das?

Manuel
13.08.2004, 00:30
Weil in den EXE-Dateien verschiedene DLLs eingebunden werden, die auch unterschiedlich groß sind. Und das unabhängig davon, ob die DLL überhaupt komplett gebraucht wird. Das Gleiche beobachte ich auch bei meinen Programmen: Wenn ich in QBasic eine EXE erstelle, ist diese immer mindestens 5 KB groß, während in Visual Basic ein im Prinzip gleiches Programm fast 1,5 MB verbraucht... also 300mal größer als eigentlich nötig O_o .

Crash-Override
13.08.2004, 03:44
Hello World mit:

Virsual Basic (inclusive DLLs etc) 1,5 MB
Borland Delphi 400 KB
Pure Basic etwa 6 KB

Quelle pure-basic Webseite ;)

MuadDib
13.08.2004, 22:10
Das liegt unter anderem daran, dass der MS Compiler u.a. auf Größe optimiert, und das von Haus aus, und der GCC (bitte, Dev-C++ ist nur ein schön bunter Editor...) auf Geschwindigkeit, und erst mit den nötigen Flags auf Größe optimiert (frag mich allerdings nicht, wie die jetzt heissen... man g++ dürfte da Aufschluss geben...)

Silencium
14.08.2004, 02:24
Man kann die .exe files auch hinterher schön mit Aspack packen, verkleinert oft um mehr als 50% und die Geschwindigkeit verändert sich nicht merklich

Jesus_666
14.08.2004, 19:23
Du kannst versuchen, gcc mit dem Flag -O* aufzurufen, wobei * eine Zahl ist. -O3 sollte schon etwas Kleineres hervorbringen, kompiliert aber auch länger.

Es könnte auch eine gute Idee sein, die Binary nach dem Kompilieren mit strip zu bearbeiten.

Ich habe mal "Hello World" vier mal kompiliert und teilweise gestript. Hier die Ergebnisse (Anm: Unter Linux, deshalb sind die Binaries von Anfang an kleiner)
1. Ohne Optimierung, ohne strip: 6445 Byte (100%)
2. Ohne Optimierung, mit strip: 4056 Byte ( 63%)
3. Optimierung mit -O3, ohne strip: 6389 Byte ( 99%)
4. Optimierung mit -O3, mit strip: 4000 Byte ( 62%)

BTW, erstellt MSVC überhaupt komplett lauffähige Binaries? AFAIK verlassen die sich stark auf eine C-Runtime, die mit Windows kommt. Das könnte ein Grund sein, warum sie so klein sind...

BTW2, UPX (http://upx.sourceforge.net/) ist auch ein brauchbarer Packer für Binaries.

LastLotus
24.08.2004, 09:35
Hm, da es hier ja um EXE Grössen geht und ich keinen neuen Thread erstellen will, missbrauche ich diesen mal für meine Frage.

Mich würde mal interessieren wie man solch "Präsentationen" wie diese 64kb grosse Zoom 3 (http://home.t-online.de/home/droid/img/zoom3.zip) Demo so klein kriegen kann ^_-. Da muss man ja bitweise coden, und da würde mir spontan nur Assembler in den Sinn kommen, vorallem um den OpenGL Teil so klein wie möglich zu halten. Habe da aber wenig Erfahrung mit. Ich frage aus reinem Interesse.



au revoir ...

Ineluki
24.08.2004, 23:06
das ganze ist nicht openGL sondern DirectX9

Das ganze IST in Assembler gecoded (Assembly ist wohl die groesste Assemblermesse) und hier sind echte Profis am Werk.

Die haben extra neue Kompressionsalgorithmen entwickelt, um z.B. 70MB Musikdaten in 5.5Kb zu pressen .... ich hab keine Ahnung, wie die das gemacht haben ...

Im prinzip lebt das ganze davon, dass alles moegliche zur laufzeit berechnet wird, damit die die daten nicht schon vorher reinstecken muessen. Die musik wird ueber einen just in time softwaresynthesizer zur laufzeit zusammengebaut, aehnlich den klassischen trackerformaten.

Nichts desto trotz ist sowas eine echte meisterleistung, und ich geh wohl recht in der annahme, dass sowas vonuns hier keiner ohne weiteres auf die beine stellen kann ...

Ynnus
25.08.2004, 03:39
Nur so nebenher gesagt, ich weiß zwar nicht ob die Programme von Visual C++ ohne Runtime.dlls lauffähig sind, und deshalb auch nur 6 KB groß sind, aber unter PureBasic kann ich 4,5 KB Große Hello-Wolrd Programme erstellen welche komplett auf Amiga, Linux und WIndows portierbar sind. Ohne jegliche Runtimes. Es wäre also auch möglich, das MSVC++ auch ohne Runtime recht klein ist, PB ist es ja auch.

Ineluki
25.08.2004, 04:21
na ja .. trotzdem ist Assembler einfach das kleinste, was du erzeugen kannst ...

Mein ebend geschriebenes "Hallo Welt." Programm ist gerade mal 29 Byte gross. Zugegeben, es ist eine COM Datei, aber im Prinzip koennte man nen header davorsetzen, ein paar byte dazuschreiben, und haette eine Exe.

Hier einmal der Quellcode fuer nasm



;Hello World Programm
ORG 100h ; COM File

EntryPoint:
mov si, message1 ; Addresse von String Message nach SI
.startloop
lodsb ; Byte laden
or al,al ; ist = 0 ?
jz short .endloop ; wenn 0, dann ende
mov ah,0x0E
int 0x10 ; Bios-Interrupt
jmp short .startloop ; naechstes Zeichen
.endloop
ret ; Ende COM File

DataSection:
message1 db "Hallo Welt.",13,10,0


Wie man sieht hab ich auf BIOS-Routinen zurueckgegriffen und nicht auf die lausige DOS-Routine int 21h. Wer benutzt schon $ als terminales Zeichen ? .. mein Prog handhabt so wenigstens Null-terminierte Strings ...
Ausserdem sollte so der Assemblercode auch recht leicht auf linux portierbar sein ...

und fuer alle, die es interessiert, hier der Maschienencode mit ASM-Entsprechung



Pos Maschienencode ASM-Code
00000000 BE0F01 MOV SI,word 0x010F
00000003 AC LODSB
00000004 08C0 OR AL,AL
00000006 7406 JE 0x0000000E
00000008 B40E MOV AH,byte 0x0E
0000000A CD10 INT byte 0x10
0000000C EBF5 JMP 0x00000003
0000000E C3 RETN
0000000F 48 byte 0x48 'H'
00000010 61 byte 0x61 'a'
00000011 6C byte 0x6C 'l'
00000012 6C byte 0x6C 'l'
00000013 6F byte 0x6F 'o'
00000014 20 byte 0x20 ' '
00000015 57 byte 0x57 'W'
00000016 65 byte 0x65 'e'
00000017 6C byte 0x6C 'l'
00000018 74 byte 0x74 't'
00000019 2E byte 0x2E '.'
0000001A 0D byte 0x0D CR
0000001B 0A byte 0x0A LF
0000001C 00 byte 0x00 NULL


Wenn man es genau betrachtet, ist das programm lediglich 15 Byte gross, der Rest sind ja die auszugebenden Daten ^^

Shin Gouki
02.09.2004, 16:51
es "interesiert" sogar SO viele Leute das sie gleich mal hier hintendran geschrieben haben
*guckguck*
öhm oder auch nicht ^^
ich glaube ich hätte den int 21h Interrupt benutzt , hatte sowie so nur ein bischen ASM ^^
aber um nochmal auf die 64kb dinger zurück zukommen die sind meistens sogar in C++ geschireben die Kbyte oder gar byte großen o_O
sind dann in ASM... die Assembly ist echt schon krass
und ja wir sind alle unwürdig :
zitat
"...
Nichts desto trotz ist sowas eine echte meisterleistung, und ich geh wohl recht in der annahme, dass sowas vonuns hier keiner ohne weiteres auf die beine stellen kann ..."
*g* ;)
-> tut mir Leid ein bsichen Ironie muss mal ab und zu sein , ok? ^^°
ah ja wer noch mehr nette kleine Demos sucht kann ja hier gucken :
http://www.scene.org/
ich mag auch ein paar der größeren
036-zeitmaschine von farbrausch gehört zu meinen favoriten :)
MFG Shin Gouki

cornuto
14.11.2004, 22:43
wenn du wert auf kleine exe dateien legst, kannst du in den linker options verhindern, dass die dll mitgelinkt werden, allerdings müssen die dlls auf dem system zur verfügung stehen. dh entweder an einem ort wo die umgebungsvariabel pfad richtig gesetzt ist oder sie muss im gleichen dir sein wie die exe.
übrigens kannst du bei devcpp unter den optionen optimierungen vornehmen, so dass du auch kleine exes bekommst.

blue lord
16.11.2004, 17:51
übrigens kannst du bei devcpp unter den optionen optimierungen vornehmen, so dass du auch kleine exes bekommst.

Muss ich mal ausprobieren.