zurück zum Artikel

Programmiersprache Go 1.20 nutzt Profiler-Informationen zum Optimieren des Codes

Rainald Menge-Sonnentag

(Bild: Pixels Hunter / shutterstock.com)

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

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 [1] 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 [2] Generics. FĂŒr die Typvorgabe (Type Constraint) comparable sind jetzt auch vergleichbare Typen erlaubt, die keine strikt vergleichbare Typen sind [3] 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 [4] 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 [5]:

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 [6] 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 [7]. Eine vollstĂ€ndige Übersicht bieten die Release Notes [8]. Der Sourcecode sowie Binaries fĂŒr unterschiedliche Betriebssysteme und Architekturen stehen auf der Download-Seite bereit [9]. Wer das aktuelle Release selbst kompilieren möchte [10], muss dafĂŒr mindestens Go 1.17.13 verwenden.

Siehe auch:

(rme [12])


URL dieses Artikels:
https://www.heise.de/-7480173

Links in diesem Artikel:
[1] https://pkg.go.dev/runtime/pprof
[2] https://www.heise.de/news/Programmiersprache-Go-erlaubt-mit-Version-1-18-generische-Programmierung-6562217.html
[3] https://go.dev/ref/spec#Comparison_operators
[4] https://www.heise.de/news/Programmiersprache-Go-1-17-stutzt-Dependencies-und-erweitert-Plattformanbindung-6167010.html
[5] https://go.dev/ref/spec#Conversions_from_slice_to_array_or_array_pointer
[6] https://go.dev/ref/spec#Package_unsafe
[7] https://go.dev/blog/go1.20
[8] https://go.dev/doc/go1.20
[9] https://go.dev/dl/
[10] https://go.dev/doc/install/source
[11] https://www.heise.de/download/product/go-69716
[12] mailto:rme@ix.de