Skip to content

Instantly share code, notes, and snippets.

@rent-a-developer
Created April 21, 2025 01:37
Show Gist options
  • Save rent-a-developer/be58cf7a0463001f08a3bda67af2ee95 to your computer and use it in GitHub Desktop.
Save rent-a-developer/be58cf7a0463001f08a3bda67af2ee95 to your computer and use it in GitHub Desktop.
Benchmarking C# for vs for each statement (plus Span<T>)
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