Dans les applications Go hautes performances, une allocation et une désallocation excessives de mémoire peuvent sérieusement affecter les performances, exerçant une pression inutile sur le garbage collector (GC), entraînant une latence accrue et une efficacité réduite. Cet article expliquera comment utiliser la technologie de réutilisation d'objets et la fonctionnalité sync.Pool
pour réduire la pression du GC.
Cet article a été inspiré par un post LinkedIn de Branko Pitulic, qui soulignait l'importance d'optimiser l'utilisation de la mémoire dans les applications Go.
Le garbage collector de Go est responsable de la gestion automatique de la mémoire. Cependant, lorsqu'une application alloue et libère de la mémoire fréquemment (en particulier sur le tas), le GC doit travailler plus fort, ce qui entraîne :
Le but est de réduire le nombre d'objets alloués sur le tas en favorisant la réutilisation de la mémoire.
Réutilisez les objets autant que possible au lieu d'en créer de nouveaux. Un modèle courant consiste à réutiliser des tranches et des tableaux.
<code class="language-go">func process() []byte { return make([]byte, 1024) // 每次都创建一个新的切片。 }</code>
<code class="language-go">var buffer = make([]byte, 1024) func process() []byte { return buffer // 重用现有的切片。 }</code>
Remarque : Cette approche fonctionne bien dans des contextes non simultanés où la réutilisation est sûre.
sync.Pool
sync
fournit le type Pool
, qui est une structure de pool d'objets efficace qui permet la réutilisation, réduisant ainsi l'allocation de mémoire sur le tas.
sync.Pool
fonctionne : <code class="language-go">package main import ( "fmt" "sync" ) func main() { // 创建一个对象池。 pool := sync.Pool{ New: func() any { return make([]byte, 1024) // 创建一个新的1KB切片。 }, } // 从池中检索一个对象。 buffer := pool.Get().([]byte) fmt.Printf("Buffer length: %d\n", len(buffer)) // 通过将对象放回池中来重用它。 pool.Put(buffer) // 从池中检索另一个对象。 reusedBuffer := pool.Get().([]byte) fmt.Printf("Reused buffer length: %d\n", len(reusedBuffer)) }</code>
Dans cet exemple :
New
pour initialiser l'objet. sync.Pool
Get
Utilisez pour retourner l'objet au pool pour l'alimentation. Put
sync.Pool
Objets légers: Les étangs conviennent très pour les petits ou moyens. Pour les grands objets, le coût de stockage peut dépasser les revenus. sync.Pool
Évitez une utilisation excessive de la piscine: New
<.> 4. Cas courants
peut vous aider.
<code class="language-go">func process() []byte { return make([]byte, 1024) // 每次都创建一个新的切片。 }</code>
sync.Pool
<code class="language-go">var buffer = make([]byte, 1024) func process() []byte { return buffer // 重用现有的切片。 }</code>
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!