![]() |
Wie bekomme ich die exe kleiner?
Meine exe kann nicht viel, doch sie bringt 15 MB auf die Waage.
Ich habe schon alle DB-Komponenten entfernt. Doch die Liste, was noch "inkludiert" ist, die ist gar lange. Wie bringe ich mein Programm am effizientesten auf eine kleine Größe? Gibt es einen Weg, die IDE (XE 3 Professional), diese Arbeit machen zu lassen? Danke! |
AW: Wie bekomme ich die exe kleiner?
Zitat:
|
AW: Wie bekomme ich die exe kleiner?
Zitat:
1. Möglichst kleine / frühe Delphiversion verwenden 2. NonVCL (eigentlich nur Luckies Domizil) 3. Nicht benötigte Units entfernen 4. benötigte Units abspecken, ggf. nur benötigten Code extrahieren und entsprechende Unit(s) entfernen 5. Debuginformationen in Compiler/Linker entfernen: Projekt -> (Standard)Optionen -> Compiler Haken bei - Optimierung an - bei [Laufzeitfehler] und [Debuggen] alles weg 6. Wohl in Projektdatei: RTTI: {$weaklinkrtti on} {$rtti explicit methods([]) properties([]) fields([])} 7. KOL-(System-)Units verwenden 8. Units ohne RTTI nochmals compilieren (lassen), sofern möglich (9. upx) |
AW: Wie bekomme ich die exe kleiner?
Zitat:
|
AW: Wie bekomme ich die exe kleiner?
Delphi-Quellcode:
hilft fast immer.
Nicht benötigte Units entfernen
Eigentlich lässt der Delphi-Compiler alles weg, was nicht verwendet wurde, aber in vielen Units gibt es einen großen Initialisazionsblock, wo Klassen initialisiert werden, aber damit werden sie auch "benutzt", selbst wenn sie nicht wirklich genutzt werden, aber da sie "benutzt" werden, ist deren Code somit immer im Programm drin, sobald diese Unit irgendwo eingebunden wurde. Auch Ressourcen, die in diesen Units eingebunden werden, sind dann immer drin, da man leider nicht angeben kann, dass diese Ressoucen nur gelinkt werden sollen, wenn bestimmte Funktionen/Klassen einkompiliert wurden. Das mit dem Initialisazionsblock ist die Schuld altmodischer/blöder Programmierer, denn hätten sie die Initialisation z.B. in einen ClassConstructor gelegt, dann wäre alles nur drin, wenn diese Klassen dann "wirklich" benutzt wurden. Ansonsten sind natürlich solche Profile, wie Debug und Release, genau dafür da. Eine Konfiguration für die Entwicklung und eine Andere für den normalen Betrieb. |
AW: Wie bekomme ich die exe kleiner?
Bist du fertig mit der Entwicklung? Sind alle Fehler draußen? Berichten die Anwender von einer hervorragenden Usability? Langweilst Du Dich? 15MB sind nicht groß. Gemessen an Terabyte Festplatten, Gigabyte Arbeitsspeicher und Gigabit Netzwerken schonmal gar nicht. In meinen Augen ist Exe-Größe etwas, das man getrost ans Ende der Entwicklung schieben kann. Du kannst natürlich noch den Weg der restlichen Welt gehen und winzige Exen durch die Beigabe von tausenden DLLs, BPLs und sonstigen Hilfsdateien, deren Versionierung ab dann minutiös beachtet werden will erkaufen. Ich würde es lassen. Administratoren übrigens, lieben monolithische Exen.
Sherlock |
AW: Wie bekomme ich die exe kleiner?
Was bringt eine kleinere EXE? Platz sparen auf der Platte - eher uninteressant wenn man 10 MB sparen kann.
Wird das Programm schneller wenn die EXE kleiner ist - kann ich mir nicht vorstellen. |
AW: Wie bekomme ich die exe kleiner?
Am schmalsten wird es wenn Du auf No-VCL umsteigst.
Je nach Fall, mal mehr mal weniger kompliziert, Luckie kennt sich damit gut aus und hat super Einsteigerfreundliche Tutorials auf seiner Web-Page. Da kann es schon vorkommen das aus Deiner 15MB Datei eine 50KB Datei wird. Alternative I: Downloade Dir einen exe-Packer wie UPX (z.Bsp.) und komprimier das Resultat. Alternative II: Komprimier mit 7zip oder RAR5 Deine Datei als SFX-Archiv, so bleibt der Transfer schmal aber beim Endverbraucher pumpt es sich wieder auf volle Größe aus. Sollte in der heutigen Zeit kein Problem darstellen, Speicher ist billig :-D |
AW: Wie bekomme ich die exe kleiner?
Zitat:
|
AW: Wie bekomme ich die exe kleiner?
IMHO nehmen indirekt einkompilierte Binärresourcen einen nicht unerheblichen Teil der EXE ein. Grad wenn man externe Komponenten wie Devexpress verwendet. Ich habe mal einen Resourceneditor genommen und aus einer 30-MB-EXE alles rausgeworfen was nach Bitmap, AVI etc. aussah. Am Ende war sie noch 9 MB groß. Lief zwar nicht mehr gescheit, aber sowhat, Hauptsache die EXE war kleiner :-D
|
AW: Wie bekomme ich die exe kleiner?
Um meine Exen kleiner zu bekommen nehme ich mpress.
Reduziert die Größe um mehr als die Hälfte UND : der Große Vorteil gegenüber UPX ist, dass bisher KEIN Virenscanner darauf angeschlagen hat |
AW: Wie bekomme ich die exe kleiner?
Exe Packer haben Nachteile, die nicht von der Hand zu weisen sind: Falsch positive durch Virenscanner mal außen vor, sorgen sie für eine ungünstige Arbeitsspeichernutzung. Und Arbeitsspeicher gibt es deutlich weniger als Plattenplatz. In diesem Thread wurde das bis zur totalen...äh... Abwendung vom Thema...mmmh, diskutiert:
![]() Sherlock |
AW: Wie bekomme ich die exe kleiner?
Zitat:
|
AW: Wie bekomme ich die exe kleiner?
Hallo,
MadExcept verhindert schon mal das Komprimieren, wohl, weil es da einen eigenen Memory-Manager gibt. |
AW: Wie bekomme ich die exe kleiner?
Danke allen für die Antworten!
und besonders dem Delphi-"Laien" für die sorgsame Liste. Ich werden die Tips einmal von oben nach unten ausprobieren. Insb. das ganz naheliegende mit "release" hatte ich nicht bedacht, da ich keine Verkaufssoftware erstelle. Cheryll |
AW: Wie bekomme ich die exe kleiner?
Zitat:
Hast du eine Zielgröße? |
AW: Wie bekomme ich die exe kleiner?
Am meisten mach das aus:
{$SetPEFlags IMAGE_FILE_RELOCS_STRIPPED} Das muss im DPR platziert werden, am besten nach den uses und vor dem {$R *.res}. Dein 15 MB bringst du aber wohl kaum unter 10-12 MB egal was du machst. Seit RTTI aktiviert ist, ist leider die Grösse der Exe's explodiert. Also als Alternative könntest du dein Projekt auf z.B. D7 "downgraden" und dann wäre es vermutlich nur noch um die 7-8 MB gross. Was willst du aber damit erreichen? |
AW: Wie bekomme ich die exe kleiner?
IMAGE_FILE_RELOCS_STRIPPED:
Und damit blockierst du gleich ein Sicherheitsfeature des Betriebssystems. Dort werden (wenn aktiv) die DLLs/EXEn im RAM willkürlich verschoben, damit mit böse Häcker in ihren Viren/Trojanern/... nicht einfach mit statischen Adressen in fremdem RAM Programmcode umschreiben können, weil das Gewünschte dann ja jedes Mal wo anders liegt. (beliebt z.B. in Buffer Overflow Exploits) Und für DLLs ist es auch noch fatal, wenn an dieser Adresse eine andere DLL oder die EXE bereits geladen ist und Windows somit deine DLL verschieben müsste, was es aber nicht mehr kann, vor allem auch deswegen, weil kaum jemand die ImageBase definiert und 99,99% aller Delphi-DLLs und EXEn eigentlich auf der selben Adresse liegen. ($00400000) Es gibt auch Progrämmchen und EXE-Packer, welche nachträglich diese Reallocation-Table entfernen. (die ist dafür da, damit Windows beim Verschieben alle Zeiger im Code anpassen kann -> auf Prozeduren, Konstanten, Typen, globale Variablen, ...............) |
AW: Wie bekomme ich die exe kleiner?
Zitat:
![]() |
AW: Wie bekomme ich die exe kleiner?
Zitat:
![]() mit ca 70 Virenschutzprogrammen Dein Kompilat testen, und meine hochgeladenen Dateien, auch wenn mit UPX gepackt, wurden noch nie bemängelt. Trotzdem danke für den Tipp mit mpress, werde ich mir genauer anschauen. |
AW: Wie bekomme ich die exe kleiner?
Zitat:
|
AW: Wie bekomme ich die exe kleiner?
EXE und DLL ist das Selbe.
Und wenn man ExePacker nutzt, dann kann das Entfernen hier auch mal zu problemen führen. (wenn zufällig der PackerCode an der selben Stelle geladen wird und er dann die EXE nicht auf seine Stelle bekommt, oder diese Stelle durch was Anderes belegt ist, wie z.B. eine DLL, welche global in alle Anwendungen injiziert wird) |
AW: Wie bekomme ich die exe kleiner?
Über Größen von Exedateien sollte sich heute keiner mehr Gedanken machen. Selbst wer nur 1 GB Arbeitsspeicher hat, bekommt keine Probleme ob die Exe nun 10 MB oder 5 MB groß ist.
Das ist alles Jammern auf hohem Niveau, mehr nicht. Was man aber definitiv machen sollte ist, auf Release umzustellen. |
AW: Wie bekomme ich die exe kleiner?
Klar ... keine Gedanken ... aber wenn man 0,7 MB (einstellige Delphiversionen) mit Richtung 20 MB aktuelle Version für eine nichtstuende Anwendung betrachtet, dann ist es dennoch nicht ganz OK.
In Richtung Mobile mit keinerem Speicher im Handy geht es aber auch heute wieder los und auch wenn man schonmal in Richtung MiniPCs ala Raspberry (auch wenn Delphi das wohl nie können wird) oder SmartWatch lunscht. |
AW: Wie bekomme ich die exe kleiner?
Eine frische Anwendung erstellt mit 10.3.3 (Debug) hat bei mir 12 MB. Release 2.3 :stupid:
|
AW: Wie bekomme ich die exe kleiner?
Zitat:
Der später Umstieg von XE6 auf 10.2 war praktisch nicht mehr relevant. Was aber relevant war, waren die Produktivitätszuwächse (Sprachfeatures, Höhere IDE-Stabilität, Besseres Debugging) und die Reduzierung der Problem durch den Compiler (Abstürze D6 mit Multisockel-Systemen) Zitat:
Heute zählt Funktionalität. Ob die Anwendung nun 5 oder 20 MB benötigt - Interessiert doch keinen mehr. |
AW: Wie bekomme ich die exe kleiner?
Och, bei 64GB oder 32GB mit MultiUser im Android, da ist schnell sowas von voll.
|
AW: Wie bekomme ich die exe kleiner?
Zitat:
Sherlock |
AW: Wie bekomme ich die exe kleiner?
Ja, die bisherigen Maßnahmen in dem Bereich waren mehrheitlich eher kosmetischer Natur.
|
AW: Wie bekomme ich die exe kleiner?
Zitat:
Zitat:
|
AW: Wie bekomme ich die exe kleiner?
Interessant, dass bei diesen "Exe Größe" Diskussionen meist komplett vergessen wird, das selbst die modernsten Prozessoren keinen duzende MB großen Instruction Cache haben. Das heißt, je größer und verteilter der ausgeführte Code, desto eher wird der CPU Durchsatz vom RAM gebremst.
Aber ja, wir reden hier von High Performance und weniger von nem GUI Progrämmchen wo das kaum Auswirkungen hat. |
AW: Wie bekomme ich die exe kleiner?
Zitat:
Hatte einen Code schön mit Assembler "optimiert", mit dem Ergebnis, dass auf modernen CPUs (die arbeiten teilweise schon den/die nächsten Befehl vor) alles extrem langsamer lief, im Gegensatz zu dem was der Delphi-Compiler produzierte. Durch ein paar Jumps wurde dieser Cache und das "umsonst" Vorgearbeitete ständig verworfen und an anderer Stelle wieder neu angefangen. :oops: Zitat:
![]() |
AW: Wie bekomme ich die exe kleiner?
Also ich versuche ja meine Programme so zu machen, dass sie den Bedürfnissen der Anwendern möglichst entspricht.
Die Grösse der Exe war in den vielen Jahren bislang nur einmal ein Thema. Und das war auch nicht bei einem Anwender sondern einem Herausgeber der meinte, er könne zu dem Buch nur zwei Disketten beilegen. :wink: Aber jedem sein Hobby wie es ihm gefällt. |
AW: Wie bekomme ich die exe kleiner?
Zitat:
Kann aber auch durchaus daran liegen, dass besonders oft ausgeführter Code ungünstig über mehrer Cachelines lag. |
AW: Wie bekomme ich die exe kleiner?
Ich habe solche Diskussionen mit Kollegen auch schon mehrfach geführt. Weniger bzgl. der Dateigröße von EXEn, aber was die Belegung von Arbeitsspeicher betrifft. Die Problemstellungen mögen bei uns sehr spezifisch sein, das Paradigma denke ich ist allgemeingültig:
Wenn man die Wahl hat zwischen hoch optimiertem Code oder einfach großen Caches im RAM, dann programiere ich bevorzugt RAM-lastig. Ganz einfach deshalb, weil es sehr zeitintensiv auf unserer Seite ist, hoch optimierten Code zu schreiben und zu pflegen. Dagegen ist Arbeitsspeicher zu kaufen und einzubauen inzwischen beinahe die lächerlich kleinste Übung. Was immer machbar ist, wird in irgendwelchen Listen (bevorzugt TDictionary oder Virtual Treeview) geparkt. Dateioperationen nur wenns unbedingt sein muss und dann per TStream angeströmt. Wobei ich mich hierbei nur auf VCL beziehe. Bei FMX und mobilen Targets sehen die Anforderungen schon ganz anders aus. |
AW: Wie bekomme ich die exe kleiner?
Zitat:
|
AW: Wie bekomme ich die exe kleiner?
G. sagt, dass durch mpress auch schon der Eine oder Andere von seinem Virenscanner genervt wurde (False-Positive)
und mit größerer Verbreitung von mpress würde bestimmt auch öfters mal ein Scanner ansprechen. Bei UPX raucht es oft, weil viele eine modifizierte Variante nutzen, die das direkte Entpacken verhindern sollten, oder wo mit schwindligen Einstellungen die Datei noch kleiner gemacht wurde. Aber hier haben bereits ein paar AntiVirenSoftwaren einen Entpacker für bekannte EXEPacker integriert, damit der Inhalt vor Programmstart geprüft werden kann, aber wenn das Entpacken aus sonstwelchen Gründen nicht geht, dann wird dem Programm schnell per se etwas Böses unterstellt. Und bei AntivirenProgrammen ohne Entpacker, aber auch bei denen Mit, landet auch oft sehr gern mal die Signatur des Packers im Virenverzeichnis, weil dessen Signatur natürlich das einzige Markante ist, und da viele böse Entwickler ihre Viren auch gern möglichst klein machen, kommt sowas öfters mit auf die Listen. :stupid: |
AW: Wie bekomme ich die exe kleiner?
Lassen sich "geUPXte" EXEn eigentlich signieren? Also nach dem Packen mit UPX meine ich. Würde das einen Unterschied machen in Bezug auf die Scanner?
|
AW: Wie bekomme ich die exe kleiner?
@Codehunter:
Ja, das geht wohl. Die EXE vom Total Commander war in Version 7.0 mit UPX gepackt und außerdem digital signiert, seit Version 7.50 ist sie nur noch signiert. Grüße Dalai |
AW: Wie bekomme ich die exe kleiner?
Die Signierung bezieht sich ja auf den Dateiinhalt.
Signieren und dann Packen geht nicht gut, aber auf das gepackte Ergebnis passt es drauf. Den Dateiinhalt zu signieren, nachdem er geladen wurde, also nachdem dessen Daten umgeschrieben wurden, mit den angepassten Adressen, wäre etwas zu umständlich. (einen Hash über etwas bilden, was sich ständig verändert). Wenn, die Signierung so arbeiten täte, dann müsste vor dem Packen signiert werden. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:12 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz