Inhaltsverzeichnis
Frageninhalt
Lösung
Heim Backend-Entwicklung Golang Warum führt die Rückkonvertierung von „interface{}' in ein Slice zu einer zusätzlichen Heap-Zuweisung?

Warum führt die Rückkonvertierung von „interface{}' in ein Slice zu einer zusätzlichen Heap-Zuweisung?

Feb 12, 2024 pm 10:15 PM
implizite Konvertierung

Warum führt die Rückkonvertierung von „interface{} in ein Slice zu einer zusätzlichen Heap-Zuweisung?

In PHP führt die Konvertierung des Typs „interface{}“ in den Slice-Typ zu einer zusätzlichen Heap-Zuweisung. Dies liegt daran, dass in PHP eine Schnittstelle ein abstrakter Datentyp und ein Slice ein dynamischer Array-Typ ist. Wenn wir einen Schnittstellentyp in einen Slice-Typ konvertieren, muss PHP dem Slice-Typ zusätzlichen Speicherplatz zuweisen, um die Elemente des Slice zu speichern. Dieser zusätzliche Heap-Zuweisungsvorgang verursacht zusätzlichen Speicheraufwand, was bei einigen speicherempfindlichen Anwendungen zu Leistungsproblemen führen kann. Daher sollten wir bei der Typkonvertierung auf dieses Problem achten und versuchen, unnötige zusätzliche Heap-Zuweisungen zu vermeiden.

Frageninhalt

func benchmarkpool(b *testing.b) {
    b.reportallocs()
    p := sync.pool{new: func() interface{} {
        return make([]byte, 1024)
    }}
    for i := 0; i < b.n; i++ {
        bts := p.get().([]byte)
        p.put(bts)
    }
}
Nach dem Login kopieren

Dieser Benchmark liefert in go1.19.5 die folgende Ausgabe.

benchmarkpool
benchmarkpool-10        47578498            24.47 ns/op       24 b/op          1 allocs/op
Nach dem Login kopieren

Anders sieht es bei der Verwendung von *[]byte:

aus
func benchmarkpool(b *testing.b) {
    b.reportallocs()
    p := sync.pool{new: func() interface{} {
        bts := make([]byte, 1024)
        return &bts
    }}
    for i := 0; i < b.n; i++ {
        bts := p.get().(*[]byte)
        p.put(bts)
    }
}
Nach dem Login kopieren
BenchmarkPool
BenchmarkPool-10        142008002            8.581 ns/op           0 B/op          0 allocs/op
Nach dem Login kopieren

Es scheint, dass die Konvertierung interface{} zurück in einen Slice zu zusätzlichen Heap-Zuweisungen führt.

Warum benötigt go diese zusätzliche Zuweisung? Welche Designüberlegungen stecken dahinter?

Lösung

Es ist nicht any[]byte 的转换,而是 []byteany 的转换。 p.Put(bts) 将参数 bts 隐式转换为 any,然后再将其传递给 (*sync.Pool).Put, das die Zuordnung verursacht. Die Schnittstelle in GoGC 1.19 ist als Zeigerpaar implementiert, von denen einer auf die Typmetadaten und einer auf das eigentliche Objekt zeigt. In diesem Fall wird der zweite Zeiger in den Pool maskiert, wodurch das Slice-Objekt zugewiesen wird. Dies gilt nicht nur für Slice-Typen, sondern auch für alle anderen Nicht-Zeiger-Typen.

Für Zeiger wie *[]byte,编译器会执行优化,将其值直接放入 iface 结构中,从而在转换为接口时删除 *[]byte führt der Compiler eine Optimierung durch, indem er seinen Wert direkt in die iface-Struktur einfügt, wodurch die Zuordnung der

-Instanz bei der Konvertierung in eine Schnittstelle entfernt wird. Daher wird im Allgemeinen empfohlen, Zeiger in einen Pool und nicht in die Struktur selbst zu setzen. 🎜

Das obige ist der detaillierte Inhalt vonWarum führt die Rückkonvertierung von „interface{}' in ein Slice zu einer zusätzlichen Heap-Zuweisung?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
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

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Chat -Befehle und wie man sie benutzt
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

So verwenden Sie Short in Java So verwenden Sie Short in Java May 07, 2024 am 03:33 AM

short ist ein primitiver Datentyp in Java, der eine 16-Bit-Ganzzahl mit Vorzeichen im Bereich von -32.768 bis 32.767 darstellt. Es wird häufig zur Darstellung kleiner Ganzzahlen wie Zähler oder IDs verwendet und unterstützt grundlegende arithmetische Operationen und Typkonvertierungen. Da es sich bei Short jedoch um einen vorzeichenbehafteten Typ handelt, müssen Sie bei der Division vorsichtig sein, um einen Über- oder Unterlauf zu vermeiden.

Verwendung von ifnull in SQL Verwendung von ifnull in SQL Apr 28, 2024 am 09:57 AM

Die IFNULL-Funktion prüft, ob ein Ausdruck NULL ist und gibt in diesem Fall den angegebenen Standardwert zurück, andernfalls gibt sie den Wert des Ausdrucks zurück. Es verhindert, dass Nullwerte Fehler verursachen, ermöglicht die Manipulation von Nullwerten und verbessert die Lesbarkeit von Abfragen. Die Verwendung umfasst: Ersetzen von Nullwerten durch Standardwerte, Ausschließen von Nullwerten aus Berechnungen und verschachtelte Verwendung zur Behandlung mehrerer Nullwertsituationen.

Was bedeutet char in Java? Was bedeutet char in Java? May 01, 2024 pm 06:15 PM

Der char-Typ wird in Java zum Speichern eines einzelnen Unicode-Zeichens verwendet und umfasst 2 Bytes im Bereich von U+0000 bis U+FFFF. Er wird hauptsächlich zum Speichern von Textzeichen verwendet. Er kann durch einfache Anführungszeichen oder Unicode-Escape-Sequenzen initialisiert werden. und kann am Vergleich teilnehmen. Gleichheits-, Ungleichheits- und Verknüpfungsoperationen können implizit in den Typ int oder explizit in Zeichenobjekte konvertiert werden.

So berechnen Sie die Division in C-Sprache So berechnen Sie die Division in C-Sprache Apr 13, 2024 pm 09:12 PM

In der Sprache C hängt das Verhalten des Divisionsoperators / vom Datentyp der Operanden ab: Ganzzahldivision: Wenn der Operand eine Ganzzahl ist, wird eine Ganzzahldivision durchgeführt und das Ergebnis abgerundet. Gleitkommadivision: Wenn der Operand eine Gleitkommazahl ist, wird eine Gleitkommadivision durchgeführt und das Ergebnis ist eine Gleitkommazahl. Typkonvertierung: Wenn ein Operand eine Ganzzahl ist und der andere nicht, wird die Ganzzahl implizit in eine Gleitkommazahl konvertiert und anschließend eine Gleitkommadivision durchgeführt. Divisor durch 0: Ein mathematischer Fehler tritt auf, wenn der Divisor 0 ist. Modulo-Operation: Verwenden Sie den %-Operator für die Modulo-Operation anstelle der Modulo-Division.

Verwendung von (+ in Oracle Verwendung von (+ in Oracle May 08, 2024 pm 08:12 PM

Der Plus-Operator (+) kann in Oracle verwendet werden, um: Zeichenfolgen, Zahlen, Datumsangaben und Zeitintervalle zu verketten; NULL-Werte zu verarbeiten und Datentypen in Nicht-NULL-Werte umzuwandeln;

Was bedeutet * in MySQL? Was bedeutet * in MySQL? Apr 26, 2024 am 07:21 AM

Das Sternchen (*) in MySQL bedeutet „alle“ und hat verschiedene Verwendungszwecke: Alle Spalten auswählen Alle Zeilen auswählen JOIN-Platzhalter für die LIKE-Klausel der Tabelle Quantifizierer für die REGEXP-Klausel Implizite Typkonvertierung

Was sind die passenden Regeln für das Überladen von C++-Funktionen? Was sind die passenden Regeln für das Überladen von C++-Funktionen? Apr 27, 2024 am 08:27 AM

Die Übereinstimmungsregeln für C++-Funktionsüberladungen lauten wie folgt: Passen Sie die Anzahl und den Typ der Parameter im Aufruf an. Die Reihenfolge der Parameter muss konsistent sein. Die Konstanz- und Referenzmodifikatoren müssen übereinstimmen. Standardparameter können verwendet werden.

Lassen Sie uns gängige Anwendungsszenarien der impliziten Typkonvertierung untersuchen! Lassen Sie uns gängige Anwendungsszenarien der impliziten Typkonvertierung untersuchen! Jan 11, 2024 pm 04:45 PM

Lassen Sie uns gängige Anwendungsszenarien der impliziten Typkonvertierung untersuchen! Einführung: In Programmiersprachen ist die implizite Typkonvertierung ein automatisch durchgeführter Datentypkonvertierungsprozess. In einigen Programmiersprachen wird diese Konvertierung implizit durchgeführt, ohne dass der Compiler oder Interpreter explizit angewiesen werden muss, die Konvertierung durchzuführen. Die implizite Typkonvertierung hat eine breite Palette von Anwendungsszenarien in der Programmierung. In diesem Artikel werden einige der häufigsten Anwendungsszenarien erläutert. Implizite Typkonvertierung bei numerischen Berechnungen Bei numerischen Berechnungen sind häufig Operationen zwischen verschiedenen Datentypen erforderlich. Wenn verschiedene Arten von Daten

See all articles