0Pricing
Go Academy · Leçon

Réduire les allocations : sync.Pool et arènes

Réutilisation des objets, sync.Pool et réduction de la pression du GC

Réduire les allocations : sync.Pool et arènes est une leçon Go Academy gratuite sur CoddyKit. Ceci est la leçon 4 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage Go Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours Go Academy comprend 4 leçons au total.

Pourquoi réduire les allocations ?

Chaque allocation sur le tas finit par déclencher du travail pour le GC. Réduire les allocations diminue la fréquence du GC et la durée des pauses, ce qui améliore le débit et la latence de queue dans les services très sollicités.

Commencez par le profilage

Profilez toujours votre programme avant de l’optimiser. Utilisez go test -benchmem et les profils du tas -alloc_space pour trouver les véritables chemins d’allocation les plus sollicités. N’optimisez pas sur la base de votre intuition.

sync.Pool

sync.Pool est un pool thread-safe d’objets réutilisables. Utilisez-le pour les objets à courte durée de vie qui sont fréquemment alloués puis supprimés (tampons d’octets, cartes de travail, contextes de requête).

var pool = sync.Pool{
    New: func() any { return &bytes.Buffer{} },
}
func process(data []byte) {
    buf := pool.Get().(*bytes.Buffer)
    buf.Reset()
    buf.Write(data)
    // use buf...
    pool.Put(buf)
}

Le pool n’est pas un cache

Le GC peut vider les éléments du pool à tout moment. Le pool sert à réduire la pression exercée par les allocations, et non à mettre en cache des données conservées longtemps. Les objets récupérés peuvent provenir de n’importe quelle goroutine.

Réinitialisez toujours avec Reset avant de réutiliser

Effacez les objets du pool avant de les utiliser : ils peuvent contenir des données provenant d’un appelant précédent. Pour bytes.Buffer, appelez Reset() ; pour les tranches, redimensionnez-les avec [:0].

Préallouer les tranches

Préallouez les tranches avec make([]T, 0, n) lorsque leur longueur finale est connue. Cela évite les agrandissements et les copies répétés à mesure que la tranche grandit.

results := make([]Result, 0, len(input)) // no reallocations

Constructeur de chaînes

Utilisez strings.Builder plutôt que la concaténation de chaînes afin d’éviter les allocations de chaînes intermédiaires dans les boucles :

var sb strings.Builder
for _, s := range parts { sb.WriteString(s) }
result := sb.String()

Mise en pool de bytes.Buffer

bytes.Buffer est l’un des types les plus couramment placés dans un pool. Placez-le dans un pool pour éviter les allocations répétées lors de l’encodage JSON, de la construction de réponses HTTP et du rendu de modèles.

Arènes Go (expérimentales)

Go 1.20+ inclut un paquet expérimental d’arènes (golang.org/x/exp/arena). Les arènes allouent de nombreux objets dans un seul grand bloc qui est libéré en une fois, ce qui évite le GC objet par objet.

Types valeur

Les petites structures passées par valeur évitent entièrement une allocation sur le tas. Évitez les schémas utilisant des pointeurs vers de petites structures dans le code très sollicité ; renvoyer des valeurs coûte souvent moins cher.

Mesurer l’impact

Exécutez les comparaisons de performances avec -benchmem avant et après, puis comparez les résultats avec benchstat. Cherchez à réduire les allocations par opération pour le chemin très sollicité, et pas seulement les nanosecondes par opération.

BenchmarkProcess-8  1000000  125 ns/op  64 B/op  2 allocs/op
// After pooling:
BenchmarkProcess-8  1000000   48 ns/op   0 B/op  0 allocs/op

Vérification rapide

Quelle caractéristique essentielle rend sync.Pool sûr pour réduire les allocations ?

Récapitulatif : réduction des allocations

Points clés :

  • Profilez d’abord : -benchmem et -alloc_space du tas avant l’optimisation
  • sync.Pool pour les objets fréquemment alloués puis supprimés ; réinitialisez toujours avec Reset avant de les réutiliser
  • Préallouez les tranches avec make([]T, 0, n) ; utilisez strings.Builder pour la concaténation
  • Les types valeur évitent les allocations sur le tas ; utilisez des comparaisons de performances pour vérifier les améliorations

Questions Fréquemment Posées

La leçon « Réduire les allocations : sync.Pool et arènes » est-elle gratuite ?

Oui — le texte complet de « Réduire les allocations : sync.Pool et arènes » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours Go Academy, passe à CoddyKit PRO. Le cours Go Academy comprend 4 leçons au total.

Qu'est-ce que j'apprendrai dans « Réduire les allocations : sync.Pool et arènes » ?

Réutilisation des objets, sync.Pool et réduction de la pression du GC Tu pratiques Go Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.

Dois-je avoir de l'expérience pour commencer Go Academy ?

Aucune expérience préalable n'est requise. Go Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 4 sur 4.

Combien de temps prend la leçon « Réduire les allocations : sync.Pool et arènes » ?

La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.

Peux-tu écrire et exécuter du code dans cette leçon Go Academy ?

Oui. Chaque leçon Go Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.

Toutes les leçons de ce cours

  1. Pile, tas et analyse d’échappement
  2. Modèle mémoire de Go et Happens-Before
  3. Fonctionnement interne du ramasse-miettes
  4. Réduire les allocations : sync.Pool et arènes
← Retour à Go Academy