.NET 8.0'da yeni [13]: Frozetet'in performansı

Womanne

Member
Bu serinin önceki bölümünde sınıfım var FrozenSet<T> İsimler adına System.Collections.Frozen .NET 8.0'da yeni olan sunuldu. Soru Microsoft'un neden olduğu hakkında ortaya çıkıyor FrozentSet<T> Ayrıca tanıtıldı. Sorunun cevabı – sıklıkla olduğu gibi – performans.








Holger Schwichtenberg, 53 ünlü uzmanla tavsiye ve eğitim yoluyla ve yazılımın geliştirilmesinde çok sayıda orta ve büyük şirketi destekleyen uzmanlar ağının teknik direktörüdür. Çok sayıda ulusal ve uluslararası uzman konferansındaki görünümleri, 90'dan fazla uzman kitabı ve 1.500'den fazla uzman makalesi sayesinde Holger Schwichtenberg, Almanya'daki .NET ve Web teknikleri için en iyi uzmanlardan biridir.







Bu sefer hızı değerlendirmek için tipik bir kullanım örneği kullanıyorum.

1 ila 10.000 arasında sayı getirilmeyen bir miktar var. Kalabalık arasında ne kadar hızlı tek bir sayı bulabilirsiniz?

Microsoft'un BenchmarkDotnet kitapçısı performansı ölçmek için 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 çizimde gösterilen ölçüt, yöntemi 1000 kez çağırıyor Contains() 10.000 sayının ilgisiz bir listesinde. Türün miktarı FrozenSet 1000 kez aradığında kazanır Contains() diğer miktarlarda nesne ile karşılaştırıldığında.







Çizim: Buna karşılık, geri çağırma 1000 kez () içerdiğinde tazelik türünün çoğu önemli ölçüde daha yüksek performans sunar ().


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





(RME)
 
Üst