Heim  >  Artikel  >  Backend-Entwicklung  >  Ist die Bestellung des Golang-Feldes wichtig?

Ist die Bestellung des Golang-Feldes wichtig?

WBOY
WBOYOriginal
2024-09-07 20:30:32691Durchsuche

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-Feldbestellung 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 recht 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 eine Auffüllung von 3 Bytes eingefügt

  • b-Länge beträgt 4 Bytes

  • c ist 1 Byte lang, 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

Die Suche nach Feldreihenfolge und Struktur kann dazu beitragen, 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 Low-Memory-Architekturen 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

Das Ordnen von Feldern 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 selbst und Ihrer Bewerbung in den nächsten Tagen dafür dankbar sein!

Das obige ist der detaillierte Inhalt vonIst die Bestellung des Golang-Feldes wichtig?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn