Grund für die enorme Größe der kompilierten ausführbaren Datei Gehen
Ich eingehalten ein Hallo Welt Programm die erzeugten native ausführbare Datei auf meinem linux-Rechner. Aber ich war überrascht zu sehen, dass die Größe des einfachen "Hello world" Programm Gehen, es war 1.9 MB !
Warum ist es, dass die ausführbare Datei von einem so einfachen Programm Gehen, ist die so riesig?
- Riesig ist? Ich denke, Sie tun nicht viel Java dann!
- Gut , im von C/C++ - hintergrund !
- Ich habe gerade versucht, diese scala-native hello world: scala-native.org/en/latest/user/sbt.html#minimal-sbt-project Es dauerte einige Zeit, zu kompilieren, herunterladen, eine Menge Zeug, und der binären 3.9 MB.
- Ich habe aktualisiert, meine Antwort unten mit 2019 Ergebnisse.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Exakt diese Frage wird in der offiziellen FAQ: Warum ist meine trivial-Programm solche großen binäre?
Zitiere die Antwort:
Also die native ausführbare Datei des Hello World ist 1,9 MB, da es enthält eine runtime bietet garbage collection, Reflexion und viele weitere Funktionen, die Ihr Programm vielleicht nicht wirklich verwenden, aber es ist da). Und die Umsetzung der
fmt
- Paket, das Sie zum drucken der"Hello World"
text (und seine Abhängigkeiten).Nun versuchen Sie Folgendes: fügen Sie ein weiteres
fmt.Println("Hello World! Again")
Linie auf Ihr Programm und kompilieren Sie es erneut. Das Ergebnis wird nicht 2x 1,9 MB, aber immer noch nur 1.9 MB! Ja, weil alle der verwendeten Bibliotheken (fmt
und Ihre Abhängigkeiten) und die Laufzeit sind bereits Hinzugefügt, um die ausführbare Datei (und so nur ein paar weitere bytes Hinzugefügt werden, um zu drucken, der 2. text, den Sie gerade Hinzugefügt haben).Betrachten Sie das folgende Programm:
Wenn ich bauen auf meinem Linux-AMD64-Rechner (Gehe 1.9), wie diese:
Ich bekomme eine Binärdatei, die über 2 Mb groß.
Der Grund für diese (die bereits in anderen Antworten) ist, dass wir mit der "fmt" - Paket ist Recht groß, aber die binary hat auch nicht beraubt worden, und dies bedeutet, dass das symbol Tabelle ist immer noch da. Wenn wir stattdessen den compiler anweisen, strip binären, es wird viel kleiner:
Jedoch, wenn wir umschreiben das Programm zur Verwendung der eingebauten Funktion print, anstelle von fmt.Println, wie diese:
Und dann kompilieren:
Wir am Ende mit einem noch kleineren binäre. Dieser ist so klein wie wir es bekommen können, ohne Rückgriff auf tricks wie den UPX-Packer, so dass der overhead des Go-Laufzeit ist in etwa 700 Kb.
Beachten Sie, dass die binäre Größe ist, die nachverfolgt werden Problem 6853 in der golang/go Projekt.
Beispielsweise commit a26c01a (für die Go-1.4) schneiden Hallo Welt von 70kB:
Angesichts der compiler, assembler, linker und runtime-für 1.5 wird
ganz im Gehen, können Sie erwarten, dass eine weitere Optimierung.
Update 2016 Gehen 1.7: dies wurde optimiert: siehe "Kleinere Gehen, 1.7 binaries".
Aber dieser Tag (April 2019), was nimmt den meisten Platz
Laufzeit.pclntab
.Siehe "Warum sind meine Go ausführbaren Dateien so groß? Größe Visualisierung Gehen executables mit D3" von Raphael 'kena' Poss.