Last active
March 14, 2023 19:52
-
-
Save teoadal/202dacd3cecb67f5f435a9cf8a0f9e53 to your computer and use it in GitHub Desktop.
This file contains 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 BenchmarkDotNet.Configs; | |
using BenchmarkDotNet.Jobs; | |
using Random = System.Random; | |
namespace Storage.Benchmark; | |
[SimpleJob(RuntimeMoniker.Net60)] | |
[SimpleJob(RuntimeMoniker.NetCoreApp31)] | |
[SimpleJob(RuntimeMoniker.Net48)] | |
[CategoriesColumn, MeanColumn] | |
[GroupBenchmarksBy(BenchmarkLogicalGroupRule.ByJob)] | |
public class ArrayReadWriteBenchmark | |
{ | |
[Benchmark] | |
public int ForeachCustom() | |
{ | |
var sum = 0; | |
foreach (ref var element in new ArrayEnumerator<int>(_array)) | |
{ | |
sum += element; | |
element = sum; | |
} | |
return sum; | |
} | |
[Benchmark(Baseline = true)] | |
public int ForeachSpan() | |
{ | |
var sum = 0; | |
foreach (ref var element in _array.AsSpan()) | |
{ | |
sum += element; | |
element = sum; | |
} | |
return sum; | |
} | |
[Benchmark] | |
public int Reference() | |
{ | |
var sum = 0; | |
for (var i = 0; i < _array.Length; i++) | |
{ | |
ref var element = ref _array[i]; | |
sum += element; | |
element = sum; | |
} | |
return sum; | |
} | |
[Benchmark] | |
public int Terrible() | |
{ | |
var sum = 0; | |
for (var i = 0; i < _array.Length; i++) | |
{ | |
sum += _array[i]; | |
_array[i] = sum; | |
} | |
return sum; | |
} | |
[Benchmark] | |
public unsafe int Unsafe() | |
{ | |
var length = _array.Length; | |
var sum = 0; | |
fixed (int* arrayPtr = &_array[0]) | |
{ | |
// ReSharper disable once TooWideLocalVariableScope | |
int* elementPtr; | |
for (var i = 0; i < length; i++) | |
{ | |
elementPtr = arrayPtr + i; | |
sum += *elementPtr; | |
*elementPtr = sum; | |
} | |
} | |
return sum; | |
} | |
#region Configuration | |
private int[] _array = null!; | |
[GlobalSetup] | |
public void Init() | |
{ | |
const int count = 1021; | |
_array = new int[count]; | |
var rnd = new Random(1234); | |
for (var i = 0; i < count; i++) | |
{ | |
_array[i] = rnd.Next(0, 10); | |
} | |
} | |
#endregion | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment