Created
April 21, 2025 01:37
-
-
Save rent-a-developer/be58cf7a0463001f08a3bda67af2ee95 to your computer and use it in GitHub Desktop.
Benchmarking C# for vs for each statement (plus Span<T>)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using BenchmarkDotNet.Attributes; | |
using System.Runtime.InteropServices; | |
using BenchmarkDotNet.Order; | |
namespace AutoIndexCache.Benchmarks; | |
[MemoryDiagnoser] | |
[Orderer(SummaryOrderPolicy.FastestToSlowest)] | |
[GcServer] | |
public class Benchmarks | |
{ | |
[GlobalSetup] | |
public void _GlobalSetup() | |
{ | |
this.list = []; | |
for (var i = 1; i <= 100_000; i++) | |
{ | |
this.list.Add(new(i)); | |
} | |
this.array = this.list.ToArray(); | |
} | |
[Benchmark()] | |
public Object Array_ForLoop() | |
{ | |
var sum = 0L; | |
for (int i = 0; i < this.array.Length; i++) | |
{ | |
var user = this.array[i]; | |
sum += user.Id; | |
} | |
return sum; | |
} | |
[Benchmark()] | |
public Object Array_ForLoop_LengthSaved() | |
{ | |
var sum = 0L; | |
var length = this.array.Length; | |
for (int i = 0; i < length; i++) | |
{ | |
var user = this.array[i]; | |
sum += user.Id; | |
} | |
return sum; | |
} | |
[Benchmark()] | |
public Object Array_ForEachLoop() | |
{ | |
var sum = 0L; | |
foreach (var user in this.array) | |
{ | |
sum += user.Id; | |
} | |
return sum; | |
} | |
[Benchmark()] | |
public Object List_ForLoop() | |
{ | |
var sum = 0L; | |
for (int i = 0; i < this.list.Count; i++) | |
{ | |
var user = this.list[i]; | |
sum += user.Id; | |
} | |
return sum; | |
} | |
[Benchmark()] | |
public Object List_ForLoop_LengthSaved() | |
{ | |
var sum = 0L; | |
var length = this.list.Count; | |
for (int i = 0; i < length; i++) | |
{ | |
var user = this.list[i]; | |
sum += user.Id; | |
} | |
return sum; | |
} | |
[Benchmark()] | |
public Object List_ForEachLoop() | |
{ | |
var sum = 0L; | |
foreach (var user in this.list) | |
{ | |
sum += user.Id; | |
} | |
return sum; | |
} | |
[Benchmark()] | |
public Object SpanFromArray_ForLoop() | |
{ | |
var sum = 0L; | |
var span = this.array.AsSpan(); | |
for (int i = 0; i < span.Length; i++) | |
{ | |
var user = span[i]; | |
sum += user.Id; | |
} | |
return sum; | |
} | |
[Benchmark()] | |
public Object SpanFromArray_ForLoop_LengthSaved() | |
{ | |
var sum = 0L; | |
var span = this.array.AsSpan(); | |
var length = span.Length; | |
for (int i = 0; i < length; i++) | |
{ | |
var user = span[i]; | |
sum += user.Id; | |
} | |
return sum; | |
} | |
[Benchmark()] | |
public Object SpanFromArray_ForEachLoop() | |
{ | |
var sum = 0L; | |
var span = this.array.AsSpan(); | |
foreach (var user in span) | |
{ | |
sum += user.Id; | |
} | |
return sum; | |
} | |
[Benchmark()] | |
public Object SpanFromList_ForLoop() | |
{ | |
var sum = 0L; | |
var span = CollectionsMarshal.AsSpan(this.list); | |
for (int i = 0; i < span.Length; i++) | |
{ | |
var user = span[i]; | |
sum += user.Id; | |
} | |
return sum; | |
} | |
[Benchmark()] | |
public Object SpanFromList_ForLoop_LengthSaved() | |
{ | |
var sum = 0L; | |
var span = CollectionsMarshal.AsSpan(this.list); | |
var length = span.Length; | |
for (int i = 0; i < length; i++) | |
{ | |
var user = span[i]; | |
sum += user.Id; | |
} | |
return sum; | |
} | |
[Benchmark()] | |
public Object SpanFromList_ForEachLoop() | |
{ | |
var sum = 0L; | |
var span = CollectionsMarshal.AsSpan(this.list); | |
foreach (var user in span) | |
{ | |
sum += user.Id; | |
} | |
return sum; | |
} | |
private Item[] array; | |
private List<Item> list; | |
private record Item(Int32 Id); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment