.NET 8.0'daki yenilikler [13]: FrozenSet performansı

Womanne

Member
Bu serinin önceki bölümünde sınıfım var FrozenSet<T> ad alanında System.Collections.Frozen .NET 8.0'daki yeni özellik tanıtıldı. Soru ortaya çıkıyor neden Microsoft FrozentSet<T> da tanıttı. Sorunun cevabı çoğu zaman olduğu gibi performanstır.

Duyuru








Dr. Holger Schwichtenberg, 53 tanınmış uzmanıyla çok sayıda orta ve büyük ölçekli şirketi danışmanlık, eğitim ve yazılım geliştirme yoluyla destekleyen www.IT-Visions.de uzman ağının teknik direktörüdür. Çok sayıda ulusal ve uluslararası konferansa katılımı, 90'dan fazla uzmanlık kitabı ve 1.500'den fazla uzmanlık makalesi sayesinde Holger Schwichtenberg, .NET ve web teknolojileri konusunda Almanya'nın en tanınmış uzmanlarından biridir.







Bu sefer hızı tipik bir uygulama örneğine dayanarak değerlendireceğim.

Veri, 1 ile 10.000 arasında sıralanmamış bir sayı kümesidir. Kümedeki tek bir sayıyı ne kadar çabuk bulabilirsin?

Performansı ölçmek için Microsoft'un BenchmarkDotNet kütüphanesi kullanılır.


using System.Collections.Frozen;
using System.Collections.Immutable;
using System.Collections.ObjectModel;
using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Configs;
using BenchmarkDotNet.Jobs;
using BenchmarkDotNet.Toolchains.InProcess.NoEmit;

namespace NET8_Console.Collections_Benchmark;

public class AntiVirusFriendlyConfig : ManualConfig
{
public AntiVirusFriendlyConfig()
{
AddJob(Job.MediumRun
.WithToolchain(InProcessNoEmitToolchain.Instance));
}
}

[Config(typeof(AntiVirusFriendlyConfig))]
public class Collections_Contains_Benchmark
{
private const int Iterations = 1000;
private readonly List<int> list;
private readonly ReadOnlyCollection<int> roCollection;
private readonly FrozenSet<int> frozenSet;
private readonly HashSet<int> hashSet;
private readonly ImmutableList<int> immutableList;
private readonly ImmutableHashSet<int> immutableHashSet;

public Collections_Contains_Benchmark()
{
var array = Enumerable.Range(1, 10000).ToArray();
Random.Shared.Shuffle<int>(array);
list = array.ToList();
// liefert ReadOnlyCollection<T>:
roCollection = list.AsReadOnly();
frozenSet = list.ToFrozenSet();
hashSet = list.ToHashSet();
immutableList = list.ToImmutableList();
immutableHashSet = list.ToImmutableHashSet();
}

[Benchmark(Baseline = true)]
public void ListContains()
{
for (var i = 0; i < Iterations; i++)
{
var b = list.Contains(i);
}
}

[Benchmark]
public void ReadOnlyCollectionContains()
{
for (var i = 0; i < Iterations; i++)
{
var b = roCollection.Contains(i);
}
}

[Benchmark]
public void FrozenSetContains()
{
for (var i = 0; i < Iterations; i++)
{
var b = frozenSet.Contains(i);
}
}

[Benchmark]
public void HashSetContains()
{
for (var i = 0; i < Iterations; i++)
{
var b = hashSet.Contains(i);
}
}

[Benchmark]
public void ImmutableListContains()
{
for (var i = 0; i < Iterations; i++)
{
var b = immutableList.Contains(i);
}
}

[Benchmark]
public void ImmutableHashSetContains()
{
for (var i = 0; i < Iterations; i++)
{
var b = immutableHashSet.Contains(i);
}
}
}



Aşağıdaki şekilde gösterilen kıyaslama yöntemi 1000 kez çağırır Contains() 10.000 numaradan oluşan sırasız bir listede. Türün miktarı FrozenSet 1000 kez izlenirse kazanır Contains() diğer nesne kümeleriyle karşılaştırıldığında.







Şekil: FrozenSet türü kümesi, 1000 kez Container() çağrıldığında önemli ölçüde daha yüksek performans sağlar.


(Resim: Ekran görüntüsü (Holger Schwichtenberg))





(kendim)



Haberin Sonu
 
Üst