Programmiersprache Go 1.20 nutzt Profiler-Informationen zum Optimieren des Codes

Neben Profile-Guided Optimization bringt das aktuelle Release erweiterte Möglichkeiten für Vergleiche in Generics und den Umgang mit Slices.

In Pocket speichern vorlesen Druckansicht

(Bild: Pixels Hunter / shutterstock.com)

Lesezeit: 3 Min.
Von
  • Rainald Menge-Sonnentag
Inhaltsverzeichnis

Im regelmäßigen Halbjahrestakt ist Go 1.20 erschienen. Das Release bringt einige Ergänzungen bei den Tools und den Sprachfeatures. Nennenswert ist vor allem die Profile-Guided Optimization beim Kompilieren.

Auf Seite der Betriebssysteme führt das Release experimentelle Anbindung an FreeBSD auf RISC-V ein. Gleichzeitig ist es das letzte, das mit Windows 7, 8, Server 2008 und 2012 sowie macOS 10.13 und 10.14 zusammenarbeitet. Go 1.21 wird mindestens Windows 10 oder Server 2016 beziehungsweise macOS 10.15 voraussetzen.

Bei der neu eingeführten Profile-Guided Optimization (PGO) oder ebenso bei der Feedback-Directed Optimization (FDO) nutzt der Compiler beim Übersetzen des Codes Informationen des Profilers für Optimierungen, die speziell auf die produktive Anwendung beziehungsweise die Workloads ausgelegt sind. So kann er beispielsweise häufig aufgerufene Funktionen als Inline-Funktionen umsetzen.

Der Compiler verwendet dazu CPU-pprof-Profile, die Go beim aktivierten Profiling erstellt. Der Blogbeitrag spricht von einem Performancegewinn von drei bis vier Prozent für typische Anwendungen. PGO befindet sich derzeit noch in der Previewphase. Das Team ermuntert daher zwar zum Ausprobieren, erklärt aber dabei, dass einige Unzulänglichkeiten noch den produktiven Einsatz verhindern könnten.

Auf der sprachlichen Seite gibt es unter anderem eine Ergänzung für die in Version 1.18 eingeführten Generics. Für die Typvorgabe (Type Constraint) comparable sind jetzt auch vergleichbare Typen erlaubt, die keine strikt vergleichbare Typen sind und potenziell zu einem Fehler zur Laufzeit führen können.

Damit lassen sich Interfaces für Vergleiche verwenden, um sie beispielsweise als Keys für eine map zu verwenden. Auch zusammengesetzte Typen wie struct, die nicht nur strikt vergleichbare Typen, sondern auch Interfaces enthalten, sind nun als comparable erlaubt.

Seit Go 1.17 lassen sich Slices in Array-Pointer umwandeln. Das aktuelle Release erlaubt nun die direkte Zuweisung eines Slice an ein Array. Im Gegensatz zu der Pointer-Umwandlung enthält das Array dabei eine Kopie der Inhalte. Wenn die Länge des Slice geringer als die des Array ist, führt die Umwandlung zu einem Laufzeitfehler, wie in dem einfachen Beispiel aus der Go-Dokumentation:

s := make([]byte, 2, 4)

a0 := [0]byte(s)
a1 := [1]byte(s[1:])     // a1[0] == s[1]
a2 := [2]byte(s)         // a2[0] == s[0]
a4 := [4]byte(s)         // panics: len([4]byte) > len(s)

Eine weitere Neuerung betrifft ebenfalls unter anderem die Slices: Das Paket unsafe für Low-Level-Programmierfunktionen erhält mit dem Release die Funktionen SliceData, String und StringData für die String- und Slice-Manipulation.

Nennenswert ist noch, dass das go-Tool nicht mehr vorkompilierte Pakete der Standard Library benötigt. Stattdessen werden diese Pakete neuerdings wie reguläre Packages bei Bedarf kompiliert und im Build-Cache abgelegt. Außerdem kann das Tool cover mit dem aktuellen Release nicht nur Testabdeckungsprofile von Unit Tests, sondern auch komplexere Läufe von Applikations- und Integrationstests erstellen.

Weitere Neuerungen in Go 1.20 lassen sich dem Go-Blog entnehmen. Eine vollständige Übersicht bieten die Release Notes. Der Sourcecode sowie Binaries für unterschiedliche Betriebssysteme und Architekturen stehen auf der Download-Seite bereit. Wer das aktuelle Release selbst kompilieren möchte, muss dafür mindestens Go 1.17.13 verwenden.

Siehe auch:

(rme)