Bis zu 40 Prozent weniger Overhead: Go 1.25 mit neuem Garbage Collector

vor 13 Stunden 2

Sechs Monate nach Go 1.24 ist Version 1.25 der Programmiersprache erschienen. Die meisten Änderungen betreffen die Toolchain, Runtime und Libraries, und ein experimenteller neuer Garbage Collector ist auch mit von der Partie. Dabei sollen fast alle Go-Programme mit der neuen Version so wie bisher kompilier- und ausführbar sein.

Als experimentelles Feature ist der neue Garbage Collector "Green Tea" verfügbar. Sein Design soll die Performance beim Markieren und Scannen kleiner Objekte verbessern. Das Go-Team erwartet in echten Projekten mit starkem Einsatz des Garbage Collectors eine Reduzierung des Garbage-Collection-Overheads zwischen 10 und 40 Prozent.

Der experimentelle Garbage Collector lässt sich mit GOEXPERIMENT=greenteagc zur Build-Zeit aktivieren. Das zugehörige GitHub-Issue bietet weitere Infos.

Für den go-Befehl gibt es einige Neuerungen. So führt die go build -asan-Option nun standardmäßig Leak Detection beim Schließen des Programms aus, was zu Fehlermeldungen in Bezug auf nicht freigegebenen Speicher führen kann. Die Go-Distribution enthält im neuen Release weniger vorgebaute Tool-Binaries: Sie liefert weiterhin Kern-Binaries der Toolchain wie Compiler und Linker, doch andere erstellt go tool erst bei Bedarf.

Zudem enthält der go vet-Befehl zwei neue Analyzer: waitgroup zum Berichten fehlplatzierter Calls an sync.WaitGroup.Add sowie hostport, der Verwendungen von fmt.Sprintf("%s:%d", host, port) zum Erstellen von Adressen für net.Dial berichtet – denn diese funktionieren nicht mit IPv6. Stattdessen schlägt der neue Analyzer vor, net.JoinHostPort zu nutzen.

Andere Neuerungen betreffen die Standard Library und den Compiler. In Letzterem hat das Go-Team einen Bug bei Nil-Pointer-Checks behoben, den die Version Go 1.21 versehentlich eingeführt hatte. Beispielsweise hätte Go den folgenden Code bisher ausgeführt, was jedoch inkorrekt ist. Nun tritt hier korrekterweise ein Panic mit Nil-Pointer Exception auf.

package main import "os" func main() { f, err := os.Open("nonExistentFile") name := f.Name() if err != nil { return } println(name) }

Weitere Details zu diesen und anderen Neuerungen in Go 1.25 lassen sich dem Go-Blog und den Release Notes entnehmen. Auf der Downloadseite steht die neue Sprachversion bereit.

(mai)

Gesamten Artikel lesen