بهبود کارآیی حلقههای foreach در دات نت 7
نویسنده: وحید نصیری
تاریخ: ۱۴۰۱/۱۰/۲۷ ۱۲:۲۰
آدرس: www.dntips.ir
| مطالب | ۳۶۹۴ |
| نویسندگان | ۲۷۶ |
| گروههای مطالب | ۱۰۲۴ |
| نقشههای راه | ۱۱۹ |
| دورهها | ۱۴ |
| اشتراکها | ۱۷۹۱۴ |
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net7.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="BenchmarkDotNet" Version="0.13.4" />
</ItemGroup>
</Project> using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Jobs;
namespace NET7Loops;
[SimpleJob(RuntimeMoniker.Net60)]
[SimpleJob(RuntimeMoniker.Net70)]
[MemoryDiagnoser(false)]
public class Benchmarks
{
private int[] ItemsArray;
private List<int> ItemsList;
[GlobalSetup]
public void Setup()
{
var random = new Random(420);
var randomItems = Enumerable.Range(0, 1000).Select(_ => random.Next());
ItemsArray = randomItems.ToArray();
ItemsList = randomItems.ToList();
}
[Benchmark]
public void For_Array()
{
for (var i = 0; i < ItemsArray.Length; i++)
{
var item = ItemsArray[i];
}
}
[Benchmark]
public void For_List()
{
for (var i = 0; i < ItemsList.Count; i++)
{
var item = ItemsList[i];
}
}
[Benchmark]
public void ForEach_Array()
{
foreach (var item in ItemsArray)
{
}
}
[Benchmark]
public void ForEach_List()
{
foreach (var item in ItemsList)
{
}
}
} using BenchmarkDotNet.Running; using NET7Loops; BenchmarkRunner.Run<Benchmarks>();
// Decompiled with JetBrains decompiler
// Type: NET7Loops.Benchmarks
// Assembly: NET7Loops, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
// MVID: E398BEE7-8123-4C55-AF9A-F7D83DDA73F1
// Assembly location: C:\Prog\1401\Net7Tests\NET7Loops\bin\Debug\net7.0\NET7Loops.dll
// Compiler-generated code is shown
using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Jobs;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.CompilerServices;
namespace NET7Loops
{
[NullableContext(1)]
[Nullable(0)]
[SimpleJob(RuntimeMoniker.Net60, -1, -1, -1, -1, null, false)]
[SimpleJob(RuntimeMoniker.Net70, -1, -1, -1, -1, null, false)]
[MemoryDiagnoser(false)]
public class Benchmarks
{
private int[] ItemsArray;
private List<int> ItemsList;
[GlobalSetup]
public void Setup()
{
Benchmarks.<>c__DisplayClass2_0 cDisplayClass20 = new Benchmarks.<>c__DisplayClass2_0();
cDisplayClass20.random = new Random(420);
IEnumerable<int> source = Enumerable.Range(0, 1000).Select<int, int>(new Func<int, int>((object) cDisplayClass20, __methodptr(<Setup>b__0)));
this.ItemsArray = source.ToArray<int>();
this.ItemsList = source.ToList<int>();
}
[Benchmark(23, "C:\\Prog\\1401\\Net7Tests\\NET7Loops\\Benchmarks.cs")]
public void For_Array()
{
for (int index = 0; index < this.ItemsArray.Length; ++index)
{
int items = this.ItemsArray[index];
}
}
[Benchmark(32, "C:\\Prog\\1401\\Net7Tests\\NET7Loops\\Benchmarks.cs")]
public void For_List()
{
for (int index = 0; index < this.ItemsList.Count; ++index)
{
int items = this.ItemsList[index];
}
}
[Benchmark(41, "C:\\Prog\\1401\\Net7Tests\\NET7Loops\\Benchmarks.cs")]
public void ForEach_Array()
{
int[] itemsArray = this.ItemsArray;
for (int index = 0; index < itemsArray.Length; ++index)
{
int num = itemsArray[index];
}
}
[Benchmark(49, "C:\\Prog\\1401\\Net7Tests\\NET7Loops\\Benchmarks.cs")]
public void ForEach_List()
{
List<int>.Enumerator enumerator = this.ItemsList.GetEnumerator();
try
{
while (enumerator.MoveNext())
{
int current = enumerator.Current;
}
}
finally
{
enumerator.Dispose();
}
}
public Benchmarks()
{
base..ctor();
}
[CompilerGenerated]
private sealed class <>c__DisplayClass2_0
{
[Nullable(0)]
public Random random;
public <>c__DisplayClass2_0()
{
base..ctor();
}
internal int <Setup>b__0(int _)
{
return this.random.Next();
}
}
}
} for (int index = 0; index < this.ItemsArray.Length; ++index)
{
int items = this.ItemsArray[index];
} List<int>.Enumerator enumerator = this.ItemsList.GetEnumerator();
try
{
while (enumerator.MoveNext())
{
int current = enumerator.Current;
}
}
finally
{
enumerator.Dispose();
}
using System;
using System.Collections.Generic;
var list = new List<int> { 1, 2 };
foreach(var item in list)
Console.Write(item);