Ich habe ein Hallo-Welt-Go-Programm befolgt, das eine native ausführbare Datei auf meinem Linux-Computer generiert hat. Aber ich war überrascht, wie groß das einfache Hello World Go-Programm war, es war 1,9 MB groß!
Warum ist die ausführbare Datei eines so einfachen Programms in Go so groß?
go
executable
Karthic Rao
quelle
quelle
dotnet publish -r win-x64 -p:publishsinglefile=true -p:publishreadytorun=true -p:publishtrimmed=true
generiert eine Binärdatei über ~ 26MB!Antworten:
Diese genaue Frage erscheint in den offiziellen FAQ: Warum ist mein triviales Programm eine so große Binärdatei?
Zitiert die Antwort:
Die native ausführbare Datei Ihrer Hello World ist also 1,9 MB groß, da sie eine Laufzeit enthält, die Speicherbereinigung, Reflektion und viele andere Funktionen bietet (die Ihr Programm möglicherweise nicht wirklich verwendet, aber vorhanden ist). Und die Implementierung des
fmt
Pakets, mit dem Sie den"Hello World"
Text gedruckt haben (plus seine Abhängigkeiten).Versuchen Sie nun Folgendes: Fügen Sie
fmt.Println("Hello World! Again")
Ihrem Programm eine weitere Zeile hinzu und kompilieren Sie sie erneut. Das Ergebnis ist nicht 2x 1,9 MB, aber immer noch nur 1,9 MB! Ja, da alle verwendeten Bibliotheken (fmt
und ihre Abhängigkeiten) und die Laufzeit bereits zur ausführbaren Datei hinzugefügt wurden (und daher nur noch wenige Bytes hinzugefügt werden, um den gerade hinzugefügten zweiten Text zu drucken).quelle
Betrachten Sie das folgende Programm:
Wenn ich dies auf meinem Linux AMD64-Computer (Go 1.9) baue, gehen Sie wie folgt vor:
Ich bekomme eine Binärdatei mit einer Größe von ca. 2 MB.
Der Grund dafür (was in anderen Antworten erklärt wurde) ist, dass wir das "fmt" -Paket verwenden, das ziemlich groß ist, aber die Binärdatei wurde auch nicht entfernt und dies bedeutet, dass die Symboltabelle noch vorhanden ist. Wenn wir stattdessen den Compiler anweisen, die Binärdatei zu entfernen, wird sie viel kleiner:
Wenn wir das Programm jedoch neu schreiben, um die integrierte Funktion print anstelle von fmt.Println zu verwenden, gehen Sie wie folgt vor:
Und dann kompiliere es:
Am Ende haben wir eine noch kleinere Binärdatei. Dies ist so klein wie möglich, ohne auf Tricks wie UPX-Packing zurückgreifen zu müssen. Der Overhead der Go-Laufzeit beträgt also ungefähr 700 KB.
quelle
Beachten Sie, dass das Problem mit der Binärgröße durch das Problem 6853 im Golang / Go-Projekt verfolgt wird .
Zum Beispiel a26c01a begehen (für Go 1.4) Schnitt Hallo Welt von 70kB :
Wenn man bedenkt, dass Compiler, Assembler, Linker und Laufzeit für 1.5 vollständig in Go sind, können Sie weitere Optimierungen erwarten.
Update 2016 Go 1.7: Dies wurde optimiert: siehe " Kleinere Go 1.7-Binärdateien ".
Aber an diesem Tag (April 2019) ist das, was am meisten Platz einnimmt
runtime.pclntab
.Siehe " Warum sind meine ausführbaren Go-Dateien so groß? Größenvisualisierung von ausführbaren Go-Dateien mit D3 " von Raphael 'kena' Poss .
quelle