Salutations, Gophers ! Au cours de la première année de travail avec Golang, je n'arrêtais pas de penser qu'il devait y avoir un ordre des champs et je me demandais pourquoi devrais-je m'en soucier ? Eh bien, ce ne sont que des champs, cela pourrait être quelque chose qui ne va pas, n'est-ce pas ? Comme la plupart des autres novices, je pensais que cela ne valait pas la peine de s’en préoccuper. En d’autres termes, dans quelle mesure pourrait-il être vital que certains champs d’une structure soient placés dans un ordre spécifique ? Eh bien, beaucoup !
L'ordre des champs est l'un des aspects ignorés au début, mais au fur et à mesure que l'on avance dans le didacticiel, cette compréhension, en particulier de la façon dont Go fonctionne avec les pointeurs, est comprise comme étant très critique. En fait, c'est précisément cet ordre qui est essentiel lorsqu'il s'agit d'améliorer les performances des applications, en particulier lorsque l'on travaille avec de grands ensembles de données ou des opérations trop gourmandes en mémoire. Cette malheureuse lacune sera corrigée en comprenant mieux pourquoi elle est si critique avec la commande sur le terrain Go.
Lorsqu'elles sont placées en mémoire, les structures sont représentées comme un bloc de mémoire consécutif, dans lequel tous les champs sont situés les uns après les autres selon leur définition dans une structure. Cela peut sembler plutôt simple, mais ce type d'organisation linéaire a également des effets assez importants, en particulier dans des domaines tels que l'alignement et le remplissage de la mémoire.
L'alignement de la mémoire concerne la façon dont les données sont placées et accessibles à partir de la mémoire. Normalement, le CPUS peut avoir un biais en termes d'endroit où les données sont récupérées en mémoire, ce que l'on appelle limites d'alignement. Par exemple, un entier de 32 bits doit être placé ou récupéré à partir de l'adresse du 4ème octet. Dans les cas où certains champs de votre structure ne sont pas correctement alignés, en parcourant les pages, un compilateur Go peut ajouter des octets de remplissage, etc. Cela devient un véritable gaspillage. Par exemple, regardez cette structure.
struct example{ a bool // 1 byte b int32 // 4bytes; c bool // 1byte d int64 //8 bytes }
Dans cette structure incorrecte en raison des règles d'alignement, le compilateur Go peut ajouter un ou plusieurs octets de remplissage au milieu de ces champs :
a fait 1 octet mais b veut 4 octets aligner donc le remplissage est inséré 3 octets
b la longueur est de 4 octets
c la longueur est de 1 octet mais pour aligner d qui nécessite 8 octets, il y a 7asing, donc un remplissage est introduit.
d la longueur est de 8 octets
Le bois, en tant que bois de construction, a toujours une taille de 24 à cause des pieds, bien que le contenu ne prenne que 14, mais regardez le volume du contenu réel plus celui du rembourrage .
La recherche de l'ordre des champs et de la structure peut aider à éviter de gaspiller de l'espace sous la forme d'une marge négative. En d'autres termes :
type Example struct { d int64 // 8 bytes b int32 // 4 bytes a bool // 1 byte c bool // 1 byte }
Dans la structure optimisée ci-dessus :
d occupe 8 octets.
b occupe 4 octets.
a et c occupent 1 octet chacun sans avoir besoin du remplissage.
Cette structure n'a désormais qu'une taille de 16 octets, ce qui est mieux que l'ancienne structure de 24 octets.
Lorsque l'on considère les applications courantes à petite échelle, il ou elle constatera très probablement que la quantité de mémoire utilisée par l'application n'est pas différente de cette dernière. Ce n'est cependant pas le cas dans la construction où les performances et même l'espace mémoire sont essentiels : il s'agit d'un système intégré, d'applications de trading ultra rapides à haute fréquence ou d'applications destinées à traiter une énorme quantité de données. Ces contraintes fidèles peuvent s'accumuler rapidement. Cela devient encore plus évident lorsque l'on construit ou opère en utilisant de nombreux grands tableaux ou tranches de structures concaténées. Il n'est pas aussi facile de remarquer un biais ou une union de charge lorsqu'une structure n'a que quelques octets de capacité supérieure. Alors que les architectures à faible mémoire sont produites en masse, avec des millions d'instances à gérer, petit à petit, cette surdose addictive de gaspillage n'est plus inconnue.
La commande des champs n'est pas seulement intéressante du point de vue de la conception des structures Golang, mais joue également un rôle important dans l'optimisation de la mémoire. Comprendre cet aspect de la façon dont Go organise la disposition de la mémoire pour vos structures et leurs pixels permet une conception de structures plus efficace dans la pratique. Un ajustement aussi insignifiant peut entraîner une amélioration considérable des performances lorsqu'il s'agit d'applications qui utilisent beaucoup de mémoire. Lorsque la prochaine opportunité se présentera pour vous de définir une structure dans Go, ne vous contentez pas de disperser ces champs. Au lieu de cela, consacrez une minute à réfléchir à la séquence – vous en serez reconnaissant envers vous-même et votre candidature dans les jours à venir !
Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.
Copyright© 2022 湘ICP备2022001581号-3