Created
August 16, 2018 10:10
-
-
Save shmutalov/749516a753e90cb83b1fbd3c3b67782c to your computer and use it in GitHub Desktop.
Benchmark example rewrite + ref locals
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
[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