Go 1.25 expérimente un ramasse-miette plus performant

Dans la version 1.25, le langage Go teste une évolution du ramasse-miette. Selon les porteurs du projet, il devrait réduire de 10 à 40% la surcharge liée à la collecte des déchets.
Annoncée récemment par l’équipe de Go, la dernière version du langage de programmation open source développé par Google apporte plusieurs fonctionnalités, dont un ramasse-miettes expérimental qui améliore les performances. La mise jour corrige aussi un bug du compilateur qui pouvait retarder les vérifications de pointeurs, et comporte un package qui prend en charge le test de code concurrent. Elle comprend également des améliorations au niveau des outils, du runtime, de la bibliothèque standard, du compilateur et de l’éditeur de liens.
Selon l’équipe de Go, le ramasse-miettes améliore les performances de marquage et d’analyse des petits objets grâce à une meilleure localisation et une plus grande évolutivité du processeur. Elle prévoit une réduction de 10 à 40 % de la charge liée au ramasse-miettes dans les programmes réels qui utilisent intensivement cet outil. Les développeurs peuvent l’activer en définissant GOEXPERIMENT=greenteaqc au moment de la compilation.
Correction d’un bug de la version 1.21
En ce qui concerne le compilateur, la version corrige un bug de Go 1.21 qui pouvait retarder de manière incorrecte les vérifications de pointeurs « nil ». Les programmes comme celui ci-dessous, qui s’exécutaient correctement alors qu’ils n’auraient pas dû, selon l’équipe de Go, vont désormais générer correctement une exception de pointeur « nil ».
package main
import « os »
func main() {
f, err := os.Open(« nonExistentFile »)
name := f.Name()
if err != nil {
return
}
println(name)
}
Dans la bibliothèque standard, Go 1.25 dispose d’un package testing/synctest qui prend en charge les tests de code concurrent. « La fonction Test exécute une fonction de test dans une « bulle » isolée », a expliqué l’équipe de Go. À l’intérieur de la bulle, le temps est virtualisé : les fonctions du package time opèrent sur une horloge fictive et celle-ci avance instantanément si toutes les goroutines de la bulle sont bloquées. De plus, la fonction Wait attend que toutes les goroutines de la bulle actuelle soient bloquées. Ce package est apparu pour la première fois dans Go 1.24 sous GOEXPERIMENT=synctest, avec une API légèrement différente. L’expérience est désormais accessible à tous.
Go 1.25 fait suite à Go 1.24, qui a été introduit en février avec des améliorations des alias de types génériques et WebAssembly. Le langage Go a récemment attiré l’attention avec le projet de Microsoft de porter le compilateur et les outils TypeScript vers ce langage, dans le but d’améliorer ses performances.
Les autres évolutions de Go 1.25
L’équipe de Go a présenté d’autres améliorations et optimisations du langage. On retrouve ainsi une implémentation JSON expérimentale, qui, lorsqu’elle est activée, fournit un paquet encoding/json/v2, qui est une révision majeure du paquet encoding/json, et le paquet encoding/json/jsontext, qui fournit un traitement de bas niveau de la syntaxe JSON. De même, l’option go build -asan effectue désormais par défaut une détection des fuites à la sortie du programme. Ainsi, une erreur sera signalée si la mémoire allouée par C n’est pas libérée et n’est référencée par aucune autre mémoire allouée par Go ou C. Côté compilateur, il peut désormais allouer le magasin de sauvegarde pour les tranches sur la pile dans un plus grand nombre de situations, ce qui améliore les performances. Avec l’éditeur de liens, il peut à présent générer des informations de débogage à l’aide de DWARF (débogage avec des formats d’enregistrement attribués) version 5.
Par ailleurs, la distribution Go comprendra moins de binaires d’outils précompilés. Les binaires de la chaîne d’outils principale, notamment l’éditeur de liens et le compilateur, seront toujours inclus, mais les outils qui ne sont pas invoqués par les opérations de compilation ou de test seront compilés et exécutés par go tool selon les besoins. L’éditeur de liens accepte dorénavant une option de ligne de commande -funcalign=N qui spécifie l’alignement des entrées de fonction. La valeur par défaut dépend de la plateforme et reste inchangée dans Go 1.25. Enfin, pour la cryptographie, MessageSigner offre une interface de signature qui peut être implémentée par les signataires qui souhaitent hacher eux-mêmes le message à signer.
La mise à jour Go 1.25 est accessible sur go.dev.