2024-03-08 14:31:00
Dans la partie précédente de cette série, j’ai la classe FrozenSet
dans l’espace de noms System.Collections.Frozen
introduit, ce qui est nouveau dans .NET 8.0. La question se pose de savoir pourquoi Microsoft FrozentSet
également introduit. La réponse à cette question est – comme bien souvent – la performance.
Publicité
Dr. Holger Schwichtenberg est le directeur technique du réseau d’experts www.IT-Visions.de qui, avec 53 experts renommés, soutient de nombreuses moyennes et grandes entreprises par le biais de conseils et de formations ainsi que de développement de logiciels. Grâce à ses participations à de nombreuses conférences nationales et internationales ainsi qu’à plus de 90 ouvrages spécialisés et plus de 1 500 articles spécialisés, Holger Schwichtenberg est l’un des experts les plus connus en Allemagne dans le domaine des technologies .NET et Web.
Cette fois, j’évaluerai la vitesse sur la base d’un exemple d’application typique.
Étant donné un ensemble non trié de nombres compris entre 1 et 10 000. À quelle vitesse pouvez-vous trouver un seul numéro dans l’ensemble ?
La bibliothèque est utilisée pour mesurer les performances BenchmarkDotNet de Microsoft pour utilisation.
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 list;
private readonly ReadOnlyCollection roCollection;
private readonly FrozenSet frozenSet;
private readonly HashSet hashSet;
private readonly ImmutableList immutableList;
private readonly ImmutableHashSet immutableHashSet;
public Collections_Contains_Benchmark()
{
var array = Enumerable.Range(1, 10000).ToArray();
Random.Shared.Shuffle(array);
list = array.ToList();
// liefert ReadOnlyCollection:
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);
}
}
}
Le benchmark illustré dans la figure suivante appelle la méthode 1 000 fois Contains()
sur une liste non triée de 10 000 numéros. La quantité du type FrozenSet
gagne lorsqu'il est vu 1000 fois Contains()
par rapport à d’autres ensembles d’objets.
(moi)
#Nouveau #dans #.NET #Performance #FrozenSet
1709986297