Table des matières
Contenu des questions
Solution
Maison développement back-end Golang Pourquoi la reconversion de « interface{} » en tranche entraîne-t-elle une allocation de tas supplémentaire ?

Pourquoi la reconversion de « interface{} » en tranche entraîne-t-elle une allocation de tas supplémentaire ?

Feb 12, 2024 pm 10:15 PM
conversion implicite

Pourquoi la reconversion de « interface{} » en tranche entraîne-t-elle une allocation de tas supplémentaire ?

En PHP, lors de la conversion du type "interface{}" en type slice, cela entraînera une allocation de tas supplémentaire. En effet, en PHP, une interface est un type de données abstrait et une tranche est un type de tableau dynamique. Lorsque nous convertissons un type d'interface en type slice, PHP doit allouer de l'espace mémoire supplémentaire au type slice afin de stocker les éléments de la tranche. Cette opération d'allocation de tas supplémentaire entraînera une surcharge de mémoire supplémentaire, ce qui peut entraîner des problèmes de performances pour certaines applications sensibles à la mémoire. Par conséquent, lors de la conversion de type, nous devons prêter attention à ce problème et essayer d'éviter une allocation de tas supplémentaire inutile.

Contenu des questions

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)
    }
}
Copier après la connexion

Ce benchmark donne le résultat suivant dans go1.19.5.

benchmarkpool
benchmarkpool-10        47578498            24.47 ns/op       24 b/op          1 allocs/op
Copier après la connexion

Les choses semblent différentes lors de l'utilisation de *[]byte :

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)
    }
}
Copier après la connexion
BenchmarkPool
BenchmarkPool-10        142008002            8.581 ns/op           0 B/op          0 allocs/op
Copier après la connexion

Il semble que la reconversion de interface{} en tranche entraîne des allocations de tas supplémentaires.

Pourquoi Go a-t-il besoin de cette allocation supplémentaire ? Quelles sont les considérations de conception derrière cela ?

Solution

Ce n'est pas any[]byte 的转换,而是 []byteany 的转换。 p.Put(bts) 将参数 bts 隐式转换为 any,然后再将其传递给 (*sync.Pool).Put qui provoque l'allocation. L'interface de GoGC 1.19 est implémentée sous la forme d'une paire de pointeurs, l'un pointant vers les métadonnées de type et l'autre vers l'objet réel. Dans ce cas, le deuxième pointeur est échappé vers le pool, provoquant l'allocation de l'objet slice. Cela s'applique non seulement aux types de tranches, mais également à tout autre type non pointeur.

Pour les pointeurs, tels que *[]byte,编译器会执行优化,将其值直接放入 iface 结构中,从而在转换为接口时删除 *[]byte, le compilateur effectue une optimisation en plaçant sa valeur directement dans la structure iface, supprimant ainsi l'allocation de l'instance

lors de la conversion en interface. Par conséquent, il est généralement recommandé de placer des pointeurs dans un pool plutôt que dans la structure elle-même. 🎜

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Commandes de chat et comment les utiliser
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Comment utiliser short en Java Comment utiliser short en Java May 07, 2024 am 03:33 AM

short est un type de données primitif en Java qui représente un entier signé de 16 bits compris entre -32 768 et 32 767. Il est souvent utilisé pour représenter de petits entiers, tels que des compteurs ou des identifiants, et prend en charge les opérations arithmétiques de base et les conversions de types. Mais comme short est un type signé, vous devez être prudent lorsque vous utilisez la division pour éviter tout débordement ou sous-dépassement.

Utilisation de ifnull dans SQL Utilisation de ifnull dans SQL Apr 28, 2024 am 09:57 AM

La fonction IFNULL vérifie si une expression est NULL et renvoie la valeur par défaut spécifiée si c'est le cas, sinon elle renvoie la valeur de l'expression. Il empêche les valeurs nulles de provoquer des erreurs, permet la manipulation des valeurs nulles et améliore la lisibilité des requêtes. L'utilisation comprend : le remplacement des valeurs nulles par des valeurs par défaut, l'exclusion des valeurs nulles des calculs et l'utilisation imbriquée pour gérer plusieurs situations de valeurs nulles.

Que signifie char en Java ? Que signifie char en Java ? May 01, 2024 pm 06:15 PM

Le type char en Java est utilisé pour stocker un seul caractère Unicode, représentant 2 octets, allant de U+0000 à U+FFFF. Il est principalement utilisé pour stocker des caractères de texte. Il peut être initialisé via des guillemets simples ou des séquences d'échappement Unicode. et peuvent participer à la comparaison, les opérations d'égalité, d'inégalité et de jointure peuvent être implicitement converties en type int ou explicitement converties en objets Character.

Comment calculer la division en langage C Comment calculer la division en langage C Apr 13, 2024 pm 09:12 PM

En langage C, le comportement de l'opérateur de division / dépend du type de données des opérandes : Division entière : Lorsque l'opérande est un entier, une division entière est effectuée et le résultat est arrondi à l'inférieur. Division en virgule flottante : lorsque l'opérande est un nombre à virgule flottante, une division en virgule flottante est effectuée et le résultat est un nombre à virgule flottante. Conversion de type : lorsqu'un opérande est un entier et que l'autre ne l'est pas, l'entier est implicitement converti en nombre à virgule flottante, puis une division en virgule flottante est effectuée. Diviseur par 0 : Une erreur mathématique se produit lorsque le diviseur est 0. Fonctionnement modulo : utilisez l'opérateur % pour le fonctionnement modulo au lieu de la division modulo.

Utilisation de (+ dans Oracle Utilisation de (+ dans Oracle May 08, 2024 pm 08:12 PM

L'opérateur plus (+) dans Oracle peut être utilisé pour : connecter des chaînes, des nombres, des dates et des intervalles de temps ; gérer les valeurs NULL et convertir les valeurs NULL en valeurs non NULL ; convertir les types de données en types de chaîne.

Que signifie * dans MySQL Que signifie * dans MySQL Apr 26, 2024 am 07:21 AM

L'astérisque (*) dans MySQL signifie « tout » et a différentes utilisations : Sélectionner toutes les colonnes Sélectionner toutes les lignes Caractères génériques JOIN pour la clause LIKE de table Quantificateur Conversion de type implicite pour la clause REGEXP

Quelles sont les règles de correspondance pour la surcharge des fonctions C++ ? Quelles sont les règles de correspondance pour la surcharge des fonctions C++ ? Apr 27, 2024 am 08:27 AM

Les règles de correspondance de surcharge de fonctions C++ sont les suivantes : faire correspondre le nombre et le type de paramètres dans l'appel. L'ordre des paramètres doit être cohérent. Les modificateurs de constance et de référence doivent correspondre. Les paramètres par défaut peuvent être utilisés.

Explorons les scénarios d'application courants de conversion de type implicite ! Explorons les scénarios d'application courants de conversion de type implicite ! Jan 11, 2024 pm 04:45 PM

Explorons les scénarios d'application courants de conversion de type implicite ! Introduction : Dans les langages de programmation, la conversion de type implicite est un processus de conversion de type de données effectué automatiquement. Dans certains langages de programmation, cette conversion est effectuée implicitement, sans qu'il soit nécessaire de demander explicitement au compilateur ou à l'interpréteur d'effectuer la conversion. La conversion de type implicite présente un large éventail de scénarios d'application en programmation. Cet article aborde certains des scénarios d'application courants. Conversion de type implicite dans les calculs numériques Dans les calculs numériques, des opérations entre différents types de données sont souvent nécessaires. Lorsque différents types de données

See all articles