Span<T> et ArrayPool<T> en C#, deux outils puissants pour écrire du code rapide et optimisé en mémoire, sans sacrifier la sécurité.
🧩 1. Span<T> — Travailler avec la mémoire sans l'allouer
✅ Qu'est-ce que c’est ?
Span<T> est une vue temporaire, rapide et sûre sur un bloc contigu de mémoire, qu’il s’agisse :
-
d’un tableau (
T[]), -
d’une portion de
stackalloc, -
ou d’une mémoire native non managée.
Il vous permet de travailler avec les données sans créer de copie ni allocation sur le heap.
✳️ Exemple simple :
int[] numbers = { 1, 2, 3, 4, 5 };
Span<int> span = numbers.AsSpan(1, 3); // [2, 3, 4]
span[0] = 20;
Console.WriteLine(numbers[1]); // Affiche 20 (modifie le tableau original)
📌 Caractéristiques :
| Propriété | Valeur |
|---|---|
| Modifiable | ✅ Oui (Span<T>) |
| Allocation sur le heap | ❌ Non |
| Stockable dans un champ de classe | ❌ Non (ref struct) |
| Accès rapide à la mémoire | ✅ Oui |
🔒 ReadOnlySpan<T> ?
Même concept, mais lecture seule :
ReadOnlySpan<char> span = "Hello World".AsSpan(6, 5); // "World"
🧩 2. ArrayPool<T> — Réutilisation des tableaux (évite le GC)
✅ Qu’est-ce que c’est ?
ArrayPool<T> permet de réutiliser des tableaux sans les allouer à chaque fois, pour réduire la pression sur le Garbage Collector (GC).
Utile dans les scénarios à haute performance : traitement de fichiers, réseau, sérialisation, etc.
✳️ Exemple simple :
using System.Buffers;
var pool = ArrayPool<byte>.Shared;
byte[] buffer = pool.Rent(1024); // loue un tableau de taille >= 1024
try
{
// Utilisation du buffer
buffer[0] = 42;
}
finally
{
pool.Return(buffer); // Très important : restituer le tableau !
}
📌 Pourquoi c’est utile ?
| Avantage | Détail |
|---|---|
| ✅ Moins de garbage | Réutilise les tableaux |
| ✅ Performance accrue | Pas de new byte[] fréquent |
| ✅ Facile à utiliser | Juste .Rent() et .Return() |
🧠 Quand utiliser quoi ?
| Besoin | Utiliser |
|---|---|
| Travailler sur une portion de mémoire sans allouer | Span<T> |
| Réutiliser des buffers entre plusieurs appels | ArrayPool<T> |
| Parser rapidement du texte ou des données binaires | Span<T>, ReadOnlySpan<T> |
| Code hautement performant ou temps réel | Les deux combinés ✅ |
🔄 Exemple combiné : ArrayPool<T> + Span<T>
var buffer = ArrayPool<byte>.Shared.Rent(1000);
try
{
Span<byte> span = buffer.AsSpan(0, 500);
span.Clear(); // Efface les 500 premiers octets
}
finally
{
ArrayPool<byte>.Shared.Return(buffer);
}
Aucun commentaire:
Enregistrer un commentaire