„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > Ist die Bestellung des Golang-Feldes wichtig?

Ist die Bestellung des Golang-Feldes wichtig?

Veröffentlicht am 04.11.2024
Durchsuche:675

Grüße, Gophers! Während des ersten Jahres meiner Zusammenarbeit mit Golang dachte ich ständig, dass es eine Reihenfolge der Felder geben muss, und ich fragte mich, warum sollte mich das stören? Nun ja, es sind nur Felder, es könnte nur etwas nicht in Ordnung sein, oder? Wie die meisten anderen Neulinge dachte ich, dass es sich nicht lohnt, sich damit herumzuschlagen. Mit anderen Worten: Wie wichtig könnte es sein, dass bestimmte Felder in einer Struktur in eine bestimmte Reihenfolge gebracht werden? Na ja, ein tolles Angebot!

Feldreihenfolge ist einer der Aspekte, die zu Beginn ignoriert werden, aber im weiteren Verlauf des Tutorials wird dieses Verständnis, insbesondere darüber, wie Go mit Zeigern arbeitet, als sehr wichtig erachtet. Tatsächlich ist genau diese Reihenfolge entscheidend, wenn es um die Verbesserung der Anwendungsleistung geht, insbesondere wenn mit großen Datenmengen oder Vorgängen gearbeitet wird, die zu viel Speicher beanspruchen. Dieser bedauerliche Mangel wird durch ein besseres Verständnis behoben, warum er bei der Go-Feldreihenfolge so wichtig ist.

Wie speichert Go Strukturen im Speicher?

Bei der Platzierung im Speicher werden Strukturen als aufeinanderfolgender Speicherblock dargestellt, in dem sich alle Felder nacheinander entsprechend ihrer Definition in einer Struktur befinden. Das mag ziemlich einfach erscheinen, aber diese Art der linearen Organisation hat auch einige ganz erhebliche Auswirkungen, insbesondere in Bereichen wie Speicherausrichtung und Auffüllung.

Speicherausrichtung und Polsterung

Bei der Speicherausrichtung geht es darum, wie Daten im Speicher abgelegt und abgerufen werden. Normalerweise kann CPUS eine Voreingenommenheit hinsichtlich der Stelle aufweisen, an der Daten im Speicher abgerufen werden, was als Ausrichtungsgrenzen bezeichnet wird. Beispielsweise sollte eine 32-Bit-Ganzzahl an der 4. Byte-Adresse platziert oder abgerufen werden. In Fällen, in denen Felder in Ihrer Struktur nicht richtig ausgerichtet sind, fügt ein Go-Compiler beim Durchblättern der Seiten möglicherweise Auffüllbytes usw. hinzu. Das wird ziemlich verschwenderisch. Schauen Sie sich zum Beispiel diese Struktur an.

struct example{

a bool   // 1 byte

b int32 // 4bytes;

c bool   // 1byte 

d int64 //8 bytes
}

Golang Field ordering matters?

In dieser aufgrund von Ausrichtungsregeln falschen Struktur fügt der Go-Compiler möglicherweise ein oder mehrere Füllbytes in der Mitte dieser Felder hinzu:

  • a ist 1 Byte, aber b möchte 4 Bytes ausrichten, daher wird ein Auffüllen von 3 Bytes eingefügt

  • b-Länge beträgt 4 Bytes

  • c hat eine Länge von 1 Byte, aber um d auszurichten, was 8 Bytes erfordert, gibt es 7asing, daher wird Auffüllen eingeführt.

  • d Länge beträgt 8 Bytes

Wie Holz auch Strukturholz ist, ist es aufgrund der Beine immer noch 24 groß, obwohl der Inhalt nur 14 einnimmt. Schauen Sie sich jedoch das Volumen des tatsächlichen Inhalts plus das der Polsterung an .

Felder für minimalen Abstand neu anordnen

Feldreihenfolge und Strukturfindung können dabei helfen, Platzverschwendung in Form eines negativen Spielraums zu vermeiden. Mit anderen Worten:

type Example struct { 

d int64 // 8 bytes

b int32 // 4 bytes

a bool // 1 byte

c bool // 1 byte

}

Golang Field ordering matters?

In der oben optimierten Struktur:

  • d belegt 8 Bytes.

  • b belegt 4 Bytes.

  • a und c belegen jeweils 1 Byte, ohne dass eine Auffüllung erforderlich ist.

Diese Struktur ist jetzt nur noch 16 Bytes groß und das ist besser als die frühere 24 Bytes große Struktur.

Warum das wichtig ist

Wenn man gängige kleine Anwendungen betrachtet, wird man höchstwahrscheinlich feststellen, dass sich die von der Anwendung verwendete Speichermenge nicht von letzterer unterscheidet. Dies ist jedoch im Baugewerbe nicht der Fall, wo Leistung und sogar Speicherplatz von entscheidender Bedeutung sind. Denken Sie an ein in das System eingebettetes System, superschnelle Hochfrequenz-Handelsanwendungen oder Anwendungen, die enorme Datenmengen verarbeiten sollen. Diese zuverlässigen Einschränkungen können sich schnell summieren. Dies wird noch deutlicher, wenn man mit vielen großen Arrays oder verketteten Struktursegmenten konstruiert oder arbeitet. Es ist nicht so einfach, Bias oder Load Union zu bemerken, wenn eine Struktur nur ein paar Bytes höhere Kapazität hat. Wenn Architekturen mit geringem Speicher in Massenproduktion hergestellt werden und die Menge an Millionen von Instanzen nach und nach verarbeitet werden muss, ist diese süchtig machende Überdosis an Verschwendung keine Seltenheit mehr.

Abschluss

Felder zu ordnen ist nicht nur aus Sicht des Golang-Strukturdesigns schön, sondern spielt auch eine wichtige Rolle bei der Speicheroptimierung. Das Verständnis dieses Aspekts, wie Go das Speicherlayout für Ihre Strukturen und deren Pixel vornimmt, ermöglicht ein effektiveres Strukturdesign in der Praxis. Eine solch unbedeutende Anpassung kann zu einer erheblichen Leistungssteigerung führen, wenn es um Anwendungen geht, die viel Speicher beanspruchen. Wenn sich für Sie das nächste Mal die Gelegenheit bietet, eine Struktur in Go zu definieren, sollten Sie diese Felder nicht einfach herumstreunen. Nehmen Sie sich stattdessen eine Minute Zeit, um über die Reihenfolge nachzudenken – Sie werden sich und Ihrer Bewerbung in den nächsten Tagen dafür dankbar sein!

Freigabeerklärung Dieser Artikel ist abgedruckt unter: https://dev.to/aymanepraxe/golang-field-ordering-matters-2i6m?1 Bei Verstößen wenden Sie sich bitte an [email protected], um ihn zu löschen
Neuestes Tutorial Mehr>

Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.

Copyright© 2022 湘ICP备2022001581号-3