Skip to content

Instantly share code, notes, and snippets.

@shmutalov
Created August 16, 2018 10:10
Show Gist options
  • Save shmutalov/749516a753e90cb83b1fbd3c3b67782c to your computer and use it in GitHub Desktop.
Save shmutalov/749516a753e90cb83b1fbd3c3b67782c to your computer and use it in GitHub Desktop.
Benchmark example rewrite + ref locals
[OrderProvider(SummaryOrderPolicy.FastestToSlowest)]
[RankColumn]
[MemoryDiagnoser]
public class Array_ByIndex_vs_CreateLocal
{
[Params(1_000_000)]
public int LoopCount { get; set; }
public Arr[] _Array;
[GlobalSetup]
public void Init()
{
_Array = new Arr[LoopCount];
for (int i = 0; i < _Array.Length; i++)
{
_Array[i] = new Arr(i);
}
}
[Benchmark]
public object CreateLocal_InLoopVariables()
{
var calcs = new(int, int, int, int, int, int, int, int, int)[_Array.Length];
for (int i = 0; i < _Array.Length; i++)
{
var item = _Array[i];
var x1 = item.x1;
var x2 = item.x2;
var x3 = item.x3;
var x4 = item.x4;
var x5 = item.x5;
var x6 = item.x6;
var x7 = item.x7;
var x8 = item.x8;
var x9 = item.x9;
calcs[i] = (x1, x2, x3, x4, x5, x6, x7, x8, x9);
}
return calcs;
}
[Benchmark]
public object CreateLocal_PreDefineVariables()
{
var x1 = 0;
var x2 = 0;
var x3 = 0;
var x4 = 0;
var x5 = 0;
var x6 = 0;
var x7 = 0;
var x8 = 0;
var x9 = 0;
for (int i = 0; i < _Array.Length; i++)
{
var item = _Array[i];
x1 = item.x1;
x2 = item.x2;
x3 = item.x3;
x4 = item.x4;
x5 = item.x5;
x6 = item.x6;
x7 = item.x7;
x8 = item.x8;
x9 = item.x9;
}
return (x1, x2, x3, x4, x5, x6, x7, x8, x9, _Array);
}
[Benchmark]
public object CreateLocalRef_InLoopVariables()
{
var calcs = new(int, int, int, int, int, int, int, int, int)[_Array.Length];
for (int i = 0; i < _Array.Length; i++)
{
ref var item = ref _Array[i];
var x1 = item.x1;
var x2 = item.x2;
var x3 = item.x3;
var x4 = item.x4;
var x5 = item.x5;
var x6 = item.x6;
var x7 = item.x7;
var x8 = item.x8;
var x9 = item.x9;
calcs[i] = (x1, x2, x3, x4, x5, x6, x7, x8, x9);
}
return calcs;
}
[Benchmark]
public object CreateLocalRef_PreDefineVariables()
{
var x1 = 0;
var x2 = 0;
var x3 = 0;
var x4 = 0;
var x5 = 0;
var x6 = 0;
var x7 = 0;
var x8 = 0;
var x9 = 0;
for (int i = 0; i < _Array.Length; i++)
{
ref var item = ref _Array[i];
x1 = item.x1;
x2 = item.x2;
x3 = item.x3;
x4 = item.x4;
x5 = item.x5;
x6 = item.x6;
x7 = item.x7;
x8 = item.x8;
x9 = item.x9;
}
return (x1, x2, x3, x4, x5, x6, x7, x8, x9, _Array);
}
[Benchmark]
public object ByIndex_InLoopVariables()
{
var calcs = new(int, int, int, int, int, int, int, int, int)[_Array.Length];
for (int i = 0; i < _Array.Length; i++)
{
var x1 = _Array[i].x1;
var x2 = _Array[i].x2;
var x3 = _Array[i].x3;
var x4 = _Array[i].x4;
var x5 = _Array[i].x5;
var x6 = _Array[i].x6;
var x7 = _Array[i].x7;
var x8 = _Array[i].x8;
var x9 = _Array[i].x9;
calcs[i] = (x1, x2, x3, x4, x5, x6, x7, x8, x9);
}
return calcs;
}
[Benchmark]
public object ByIndex_PreDefineVariables()
{
var x1 = 0;
var x2 = 0;
var x3 = 0;
var x4 = 0;
var x5 = 0;
var x6 = 0;
var x7 = 0;
var x8 = 0;
var x9 = 0;
for (int i = 0; i < _Array.Length; i++)
{
x1 = _Array[i].x1;
x2 = _Array[i].x2;
x3 = _Array[i].x3;
x4 = _Array[i].x4;
x5 = _Array[i].x5;
x6 = _Array[i].x6;
x7 = _Array[i].x7;
x8 = _Array[i].x8;
x9 = _Array[i].x9;
}
return (x1, x2, x3, x4, x5, x6, x7, x8, x9, _Array);
}
}
public struct Arr
{
public Arr(int i)
{
x1 = i;
x2 = i + 2;
x3 = i + 3;
x4 = i + 4;
x5 = i + 5;
x6 = i + 6;
x7 = i + 7;
x8 = i + 8;
x9 = i + 9;
}
public int x1 { get; set; }
public int x2 { get; set; }
public int x3 { get; set; }
public int x4 { get; set; }
public int x5 { get; set; }
public int x6 { get; set; }
public int x7 { get; set; }
public int x8 { get; set; }
public int x9 { get; set; }
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment