Die Konvertierung kleiner ganzzahliger Werte in die Schnittstelle erfolgt jetzt ohne Zuweisungen.In diesem kurzen Beitrag werde ich Ihnen sagen, was die Optimierung ist.
Wie die Schnittstelle {} in Go funktioniert
Um zu verstehen, wie diese Optimierung funktioniert, müssen Sie das Schnittstellengerät {} in Go auffrischen. Ich werde nicht zu sehr auf dieses Thema eingehen, sondern mich nur an die Hauptideen erinnern.
In src / runtime / runtime2.go gibt es eine Struktur wie diese:
type iface struct {
tab *itab
data unsafe.Pointer
}
Dies ist unsere Schnittstelle. Tatsächlich besteht die Schnittstelle {} nur aus 2 Zeigern:
- Daten - Ein Zeiger auf die Daten selbst, für die der Speicher auf dem Heap zugewiesen wurde
- tab - Metainformationen zur Schnittstelle und zum Basistyp
Wir visualisieren das gewonnene Wissen und gehen weiter.
Was ist das eigentliche Problem?
In Go ist das Zuweisen neuer Objekte in der Hüfte teuer. Wenn Sie also produktiven Code schreiben möchten, werden Sie definitiv mit diesem Problem konfrontiert sein. Selbst auf den ersten Blick können geringfügige Optimierungen die Leistung der gesamten Anwendung verbessern.
Das Problem, das durch die betrachtete Optimierung gelöst wird, besteht darin, dass es ein verschwenderisches Unterfangen ist, Objekte für kleine ganze Zahlen zuzuweisen.
Wie wurde es gelöst
Hier ist, was die Jungs von Go gemacht haben. Im Laufzeitpaket hatten sie bereits ein statisches Array von Ganzzahlen von 0 bis 255. In dem Moment, in dem eine Ganzzahl in die Schnittstelle {} konvertiert wird, wird geprüft, ob diese Zahl im angegebenen Bereich liegt, und wenn ja, ein Zeiger auf ein Element in diesem Array. Dadurch entfällt eine unnötige Zuordnung.
Sie können die Änderungen auf dem Gihab sehen .
Diese Art von Optimierungen ist in Go nicht neu. Wenn Sie also eine einstellige ASCII-Zeichenfolge erstellen, werden keine Speicherzuordnungen vorgenommen. Es werden nicht alle nach demselben Szenario vorhanden sein: Die Go-Laufzeit enthält ein statisches Array von Zeichenfolgen mit einem Zeichen. Übrigens, keine Sorge, heutzutage lebt nur ein statisches Array von Werten von 0 bis 255 zur Laufzeit. Es wird für Zeichenfolgendarstellungen wiederverwendet.