Conversion d'entiers en interface {} dans Go 1.15

Dans la version 1.15 des ordinateurs portables Go, j'ai trouvé l' entrée suivante :

La conversion de petits nombres entiers vers l'interface s'effectue désormais sans allocations.
Dans ce court article, je vais vous dire ce qu'est l'optimisation.



Fonctionnement de l'interface {} dans Go



Pour comprendre le fonctionnement de cette optimisation, vous devez rafraîchir le périphérique d'interface {} dans Go. Je ne m'étendrai pas trop sur ce sujet, rappelons simplement les idées principales.



Dans src / runtime / runtime2.go, il y a une structure comme celle-ci:



type iface struct {
	tab  *itab
	data unsafe.Pointer
}


Ceci est notre interface. En fait, l'interface {} ne comporte que 2 pointeurs:



  • data - un pointeur vers les données elles-mêmes pour lesquelles la mémoire a été allouée sur le tas
  • tab - méta-informations sur l'interface et le type de base


Nous visualisons les connaissances acquises et passons à autre chose.







Quel est le problème réel 



Dans Go, allouer de nouveaux objets à la hanche coûte cher. Par conséquent, si vous souhaitez écrire du code productif, vous serez certainement confronté à ce problème. Ainsi, toutes les optimisations mineures, même à première vue, peuvent améliorer les performances de l'ensemble de l'application.



Le problème que l’optimisation envisagée résout est que l’allocation d’objets pour de petits nombres entiers est une entreprise inutile.



Comment ça a été résolu



Voici ce que les gars de Go ont fait. Dans le package d'exécution, ils avaient déjà un tableau statique d'entiers de 0 à 255. Au moment où un entier est converti en interface {}, on vérifie si ce nombre est dans la plage spécifiée, et si c'est le cas, un pointeur vers un élément de ce tableau. Cela élimine les allocations inutiles.



Vous pouvez voir les changements sur le gihab .



Ces types d'optimisations ne sont pas nouveaux dans Go. Ainsi, si vous créez une chaîne ascii à un caractère, il n'y aura aucune allocation de mémoire. Il n'y en aura pas tous selon le même scénario: le runtime Go contient un tableau statique de chaînes à un seul caractère. Soit dit en passant, ne vous inquiétez pas, car de nos jours, un seul tableau statique de valeurs de 0 à 255 vit à l'exécution.



All Articles