Neu in .NET 6 [13]: EnsureCapacity() für Objektmengen

Die neue Methode EnsureCapacity() reserviert Speicher in .NET-Objektmengen.

In Pocket speichern vorlesen Druckansicht 1 Kommentar lesen
Lesezeit: 1 Min.
Von
  • Dr. Holger Schwichtenberg

Die neue Methode EnsureCapacity() reserviert Speicher in .NET-Objektmengen.

In .NET 6 hat Microsoft in den Mengentypen List<T>, Stack<T> und Queue<T> die Methode EnsureCapacity() ergänzt. Damit kann eine Menge auf eine gewünschte Größe gebracht werden und vermeidet, dass diese sich beim Ergänzen von Elementen immer wieder ausdehnen muss, was einen gewissen Zeitaufwand bedeutet.

Mit dem folgenden Programmcode kann man einen messbaren Geschwindigkeitsvorteil beim Einsatz von EnsureCapacity() nachweisen:

/// <summary>
/// Leistung mit und ohne EnsureCapacity()
/// Dr. Holger Schwichtenberg, 2021
/// </summary>
public static void EnsureCapacityPerfTest()
{
CUI.H2("EnsureCapacity für List<T>, Stack<T>, "and Queue<T>");
int count = 100000000;

void FillCollection(List<double> list, int count)
{
for (int i = 0; i < count; i++)
{
list.Add(Math.Sin((double)i));
}
}

void MemoryCleanup()
{
GC.Collect();
GC.WaitForPendingFinalizers();
}

for (int i = 0; i < 10; i++)
{
MemoryCleanup();

var sw1 = new Stopwatch();
sw1.Start();
List<double> list1 = new();
FillCollection(list1, count);
sw1.Stop();

Console.WriteLine(list1.Count +
"x Add() ohne EnsureCapacity(): " +
sw1.ElapsedMilliseconds);

MemoryCleanup();

var sw2 = new Stopwatch();
sw2.Start();
List<double> list2 = new();
list2.EnsureCapacity(count);
FillCollection(list2, count);
sw2.Stop();
Console.WriteLine(list2.Count +
"x Add() mit EnsureCapacity(): " +
sw2.ElapsedMilliseconds);
}
}

Ausgabe des obigen Listings

Die knappe Dokumentation zu EnsureCapacity() findet sich in der .NET-Klassenbibliotheksdokumentation. Etwas mehr steht auf GitHub. ()