Désormais au stade de version candidate, cette mise à jour prévue de Go, le langage open source développé par Google et réputé pour sa simplicité, sa concurrence et ses fonctionnalités de programmation fonctionnelle présente en avant-première l'optimisation guidée par le profil (Profile Guided Optimization, PGO) pour le compilateur. Annoncée le 7 décembre dernier, la version candidate de Go 1.20 est téléchargeable sur go.dev. La version de production est attendue en février 2023.
Le support anticipé de l'optimisation guidée par le profil apporté par cette version offre à la chaîne d'outils du compilateur d'effectuer des améliorations spécifiques à l'application et à la charge de travail en fonction des données du profil d'exécution. Actuellement, le compilateur prend en charge les profils CPU pprof, qui peuvent être collectés via les paquets runtime/pprof ou net/http/pprof. La version 1.20 utilise PGO pour mettre en ligne de manière plus agressive les fonctions là où les appels sont les plus importants. Les benchmarks pour un ensemble représentatif de programmes Go montrent que l'activation de l'optimisation en ligne de PGO améliore les performances d'environ 3 à 4 %. D'autres optimisations PGO sont prévues pour les prochaines versions.
Des évolutions dans le langage
Par ailleurs, Go 1.20 introduit quatre changements dans le langage. Premièrement, la possibilité de convertir le slice en pointeur de tableau, une amélioration apportée dans la version Go 1.17 livrée en 2021, a été étendue pour transformer les conversions de slice en tableau, selon les notes de version provisoires. Deuxièmement, le paquet unsafe définit trois autres fonctions : SliceData, String, et StringData. Elles offrent la possibilité complète de construire et de déconstruire des valeurs de slide et de chaînes sans dépendre de la représentation exacte.
Troisièmement, la spécification définit désormais que les valeurs struct sont comparées un champ à la fois, en considérant les champs dans l'ordre où ils apparaissent dans la définition du type struct et en s'arrêtant à la première discordance. Enfin, les types comparables comme les interfaces ordinaires peuvent à présent satisfaire aux contraintes comparables, même si les arguments de type ne sont pas strictement comparables. Cela permet l'instanciation d'un paramètre de type contraint par un comparable avec un argument de type non strictement comparable tel qu'un type interface, ou un type composite contenant un type interface.
Les autres innovations
Autres nouveautés de Go 1.20 :
- Le runtime ajoute un support expérimental pour l'allocation d'arène sécurisée par la mémoire qui libère rapidement la mémoire en grande quantité. Cela pourrait améliorer les performances du CPU.
- La collecte de profils de couverture de code pour les programmes est prise en charge, y compris pour les applications et les tests d'intégration, par opposition aux seuls tests unitaires.
- Le répertoire $GOROOT/pkg ne stocke plus les activités de paquet précompilées pour la bibliothèque standard. Désormais, les paquets de la bibliothèque sont construits selon les besoins et mis en cache dans le cache de construction. Cela réduit la taille de la distribution Go et évite le déséquilibre de la chaîne d'outils C pour les paquets qui utilisent cgo.
- L'implémentation de go test -json a été améliorée pour être plus robuste. Les programmes qui exécutent go test -json n'ont pas besoin d'être mis à jour.
- La commande gocode définit dorénavant les balises de construction des fonctionnalités d'architecture.
- La commande go désactive désormais cgo par défaut sur les systèmes ne disposant pas d'une chaîne d'outils C.
- La commande go version -m prend maintenant en charge la lecture d'un plus grand nombre de types de binaires Go, notamment les DLL Windows construites avec go build- buildmode=c shared et les binaires Linux sans permission d'exécution.
- Un support expérimental a été ajouté pour FreeBSD sur RISC-V.
- Go 1.20 sera la dernière version à fonctionner sous macOS 10.13 High Sierra ou 10.14 Mojave. Go 1.21 nécessitera macOS 10.15 Catalina ou une version ultérieure.
Go 1.20 fait suite à Go 1.19 publiée le 2 août, laquelle améliorait les génériques et le modèle de mémoire.