Vergleichen wir c und gehen: Hello_world.c:
#include<stdio.h>
int main(){
printf("Hello world!");
}
Hello_world.go:
package main
import "fmt"
func main(){
fmt.Printf("Hello world!")
}
Kompilieren Sie beide:
$gcc Hello_world.c -o Hello_c
$8g Hello_world.go -o Hello_go.8
$8l Hello_go.8 -o Hello_go
und was ist das?
$ls -ls
... 5,4K 2010-10-05 11:09 Hello_c
... 991K 2010-10-05 11:17 Hello_go
Über 1 MB Hallo Welt. Willst du mich verarschen? Was ich falsch mache?
(Strip Hello_go -> nur 893K)
Antworten:
Ist es ein Problem, dass die Datei größer ist? Ich kenne Go nicht, aber ich würde annehmen, dass es statisch eine Laufzeitbibliothek verknüpft, was für das C-Programm nicht der Fall ist. Aber wahrscheinlich ist das kein Grund zur Sorge, sobald Ihr Programm größer wird.
Wie hier beschrieben , ist die statische Verknüpfung der Go-Laufzeit die Standardeinstellung. Auf dieser Seite erfahren Sie auch, wie Sie die dynamische Verknüpfung einrichten.
quelle
Wenn Sie ein Unix-basiertes System (z. B. Linux oder Mac OSX) verwenden, können Sie versuchen, die in der ausführbaren Datei enthaltenen Debugging-Informationen zu entfernen, indem Sie sie mit dem Flag -w erstellen:
Die Dateigrößen werden drastisch reduziert.
Weitere Informationen finden Sie auf der GDB-Seite: http://golang.org/doc/gdb
quelle
strip
Befehl:go build prog.go; strip prog
dann haben wir so genannten Streifen ausführbare Datei: ELF 64-Bit - LSB ausführbare Datei, x86-64, Version 1 (SYSV), dynamisch gelinkt (verwendet Libs gemeinsam), gestrippt-w
anstelle von-s
. IchDie Antwort 2016:
1. Verwenden Sie Go 1.7
2. Kompilieren Sie mit
go build -ldflags "-s -w"
3. Dann verwenden
upx
,goupx
wird seit 1.6 nicht mehr benötigt.quelle
Go-Binärdateien sind groß, da sie statisch verknüpft sind (mit Ausnahme von Bibliotheksbindungen, die cgo verwenden). Wenn Sie versuchen, ein C-Programm statisch zu verknüpfen, wird es auf eine vergleichbare Größe anwachsen.
Wenn dies wirklich ein Problem für Sie ist (was ich kaum glauben kann), können Sie mit gccgo kompilieren und dynamisch verknüpfen.
quelle
Sie sollten goupx bekommen , es wird Golang ELF ausführbare Dateien "reparieren", um damit zu arbeiten
upx
. In einigen Fällen ist die Dateigröße bereits um 78% kleiner geworden~16MB >> ~3MB
.Das Kompressionsverhältnis liegt normalerweise bei 25%, daher ist es einen Versuch wert:
>>
EXTRA:
-s
Flag (Streifen) kann die Bin-Datei noch weiter verkleinerngoupx -s filename
quelle
Erstellen Sie eine Datei mit dem Namen
main.go
, versuchen wir es mit einem einfachen Hallo-Welt-Programm.Ich benutze go Version 1.9.1
Kompilieren Sie mit dem Standardbefehl
go build
.Lassen Sie uns noch einmal mit kompilieren,
go build
aber mitldflags
wie oben vorgeschlagen,Die Dateigröße wird um 30% reduziert.
Lassen Sie uns jetzt verwenden
gccgo
,Bauen gehen mit
gccgo
,Die Binärgröße wird um fast 100% reduziert. Lassen Sie uns noch einmal versuchen, unsere
main.go
mitgccgo
aber mit Build-Flags zu bauen.Warnung: Da
gccgo
Binärdateien dynamisch verknüpft wurden. Wenn Sie eine Binärdatei haben, die sehr groß ist, wird Ihre Binärdatei beim Kompilieren mit gccgo nicht um 100% verringert, sondern um einen beträchtlichen Betrag.Im Vergleich zu gc kompiliert gccgo Code langsamer, unterstützt jedoch leistungsfähigere Optimierungen, sodass ein von gccgo erstelltes CPU-gebundenes Programm normalerweise schneller ausgeführt wird. Alle im Laufe der Jahre in GCC implementierten Optimierungen sind verfügbar, einschließlich Inlining, Schleifenoptimierungen, Vektorisierung, Befehlsplanung und mehr. Während es nicht immer besseren Code erzeugt, können mit gccgo kompilierte Programme in einigen Fällen 30% schneller ausgeführt werden.
Die GCC 7-Versionen werden voraussichtlich eine vollständige Implementierung der Go 1.8-Benutzerbibliotheken enthalten. Wie bei früheren Versionen ist die Go 1.8-Laufzeit nicht vollständig zusammengeführt, dies sollte jedoch für Go-Programme nicht sichtbar sein.
Vorteile:
Nachteile
go
.Sie können hier und hier sehen .
quelle
gogcc
unterstützt ARM-Prozessor nicht, ist das richtig? Und können Sie ein Tool vorschlagen, das die Größe der Golang-Build-Datei reduziert?Kompakteres Hallo-Welt-Beispiel:
Wir sind große
fmt
Paket übersprungen und merklich reduziert binär:Nicht so kompakt wie C, aber obwohl in K nicht M gemessen :) Ok, es ist kein allgemeiner Weg, der nur einige Möglichkeiten zur Optimierung einer Größe zeigt: Verwenden Sie einen Streifen und versuchen Sie, minimale Pakete zu verwenden. Wie auch immer, Go ist keine Sprache, um winzige Binärdateien zu erstellen.
quelle
Antwort 2018 für den nächsten Go 1.11, wie von Brad Fitzpatrick (Mitte Juni 2018) getwittert :
Vgl. Golang Ausgabe 11799 :
Weitere Informationen finden Sie in Commit 594eae5
Rob Pike erwähnt :
Brad antwortete:
Gründe : Debuggen von Informationen, aber auch Registrieren der Karte für den GC, damit jede Anweisung ein Sicherungspunkt ist.
quelle
Die Binärdatei enthält standardmäßig den Garbage Collector, das Schedulding-System, das die Go-Routinen verwaltet, und alle von Ihnen importierten Bibliotheken.
Das Ergebnis ist eine minimale Größe von ca. 1 MB.
quelle
Ab Go 1.8 können Sie das neue Plugin-System auch verwenden, um Ihre Binärdatei in etwas aufzuteilen, das gemeinsam genutzten Bibliotheken ähnelt. In dieser Version funktioniert es nur unter Linux, aber andere Plattformen werden wahrscheinlich in Zukunft unterstützt.
https://tip.golang.org/pkg/plugin/
quelle
Standardmäßig verknüpft gcc dynamisch und statisch.
Wenn Sie Ihren C-Code jedoch statisch verknüpfen, erhalten Sie möglicherweise eine Binärdatei mit einer größeren Größe.
In meinem Fall:
Beide Binärdateien sind statisch verknüpft und ohne debug_info.
quelle
Sie können einen Blick auf meine kleine Recherche zu diesem Thema werfen: https://github.com/xaionaro/documentation/blob/master/golang/reduce-binary-size.md
Es wird Schritt für Schritt gezeigt, wie ein statisch-binäres 2-MB-Hallo-Welt-Beispiel auf 15-KB-statisch-binär oder auf 10-KB-dynamisch-binär reduziert wird. Natürlich gibt es viele Einschränkungen.
quelle