Lorsque vous traitez de grands ensembles de données, les implications en termes de performances de la copie de mémoire peuvent être significatives. Cet article explore une solution pour convertir une chaîne en tranche d'octets sans copie de mémoire, en tirant parti du package non sécurisé dans Go.
Les chaînes dans Go sont immuables, ce qui signifie qu'elles ne peuvent pas être modifié une fois créé. Ce comportement garantit l'intégrité des données mais empêche également les modifications directes de la tranche d'octets sous-jacente.
Pour contourner la restriction d'immuabilité, nous pouvons exploiter le package non sécurisé, qui permet un accès direct à adresses mémoire. La fonction suivante montre comment obtenir une tranche d'octets à partir d'une chaîne sans copier :
<code class="go">func unsafeGetBytes(s string) []byte { return (*[0x7fff0000]byte)(unsafe.Pointer( (*reflect.StringHeader)(unsafe.Pointer(&s)).Data), )[:len(s):len(s)] }</code>
Ce code fonctionne comme suit :
Il est important de noter que la chaîne vide ("") n'est associée à aucun octet. Par conséquent, la vérification suivante est nécessaire dans la fonction :
<code class="go">if s == "" { return nil // or []byte{} }</code>
Bien que cette technique élimine la copie de mémoire, il convient de noter que les opérations de compression de données, comme celles effectuées avec gzip, nécessitent une surcharge de calcul importante par rapport au coût de copie de quelques octets. Les gains de performances en évitant les copies de chaînes sont probablement négligeables.
Pour écrire des chaînes sur un io.Writer, l'approche recommandée consiste à utiliser io.WriteString(), qui tente d'éviter la copie la chaîne si possible.
Le package unsafe fournit un moyen d'obtenir une tranche d'octets à partir d'une chaîne sans copie de mémoire, efficacement en convertissant le pointeur interne de la chaîne vers une tranche d'octets. Cependant, cette technique doit être réservée à des scénarios spécifiques critiques pour les performances et utilisée avec prudence.
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!