Skip to content

Commit 7565e73

Browse files
committed
Add some benchmarks for array deabstraction
See dotnet/runtime#108913
1 parent fd0d92d commit 7565e73

File tree

1 file changed

+162
-0
lines changed
  • src/benchmarks/micro/runtime/DeAbstraction

1 file changed

+162
-0
lines changed
Lines changed: 162 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,162 @@
1+
// Licensed to the .NET Foundation under one or more agreements.
2+
// The .NET Foundation licenses this file to you under the MIT license.
3+
// See the LICENSE file in the project root for more information.
4+
5+
using BenchmarkDotNet.Attributes;
6+
using MicroBenchmarks;
7+
using System.Collections.Generic;
8+
using System.Linq;
9+
using System.Runtime.CompilerServices;
10+
using System.Threading;
11+
12+
[MemoryDiagnoser]
13+
[BenchmarkCategory(Categories.Runtime)]
14+
public class ArrayDeAbstraction
15+
{
16+
static readonly int[] s_ro_array;
17+
static int[] s_array;
18+
int[] m_array;
19+
20+
static int[] newArr() => new int[512];
21+
22+
[GlobalSetup]
23+
public void Setup()
24+
{
25+
m_array = newArr();;
26+
}
27+
28+
static ArrayDeAbstraction()
29+
{
30+
s_ro_array = newArr();
31+
s_array = newArr();
32+
}
33+
34+
static IEnumerable<int> get_static_readonly_array() => s_ro_array;
35+
static IEnumerable<int> get_static_array() => s_array;
36+
IEnumerable<int> get_member_array() => m_array;
37+
[MethodImpl(MethodImplOptions.NoInlining)]
38+
IEnumerable<int> get_opaque_array() => m_array;
39+
40+
[Benchmark(Baseline = true)]
41+
public int foreach_static_readonly_array()
42+
{
43+
int sum = 0;
44+
foreach (int i in s_ro_array) sum += i;
45+
return sum;
46+
}
47+
48+
[Benchmark]
49+
public int foreach_static_readonly_array_via_local()
50+
{
51+
int[] e = s_ro_array;
52+
int sum = 0;
53+
foreach (int i in e) sum += i;
54+
return sum;
55+
}
56+
57+
[Benchmark]
58+
public int foreach_static_readonly_array_via_interface()
59+
{
60+
IEnumerable<int> e = s_ro_array;
61+
int sum = 0;
62+
foreach (int i in e) sum += i;
63+
return sum;
64+
}
65+
66+
[Benchmark]
67+
public int foreach_static_readonly_array_via_interface_property()
68+
{
69+
var e = get_static_readonly_array();
70+
int sum = 0;
71+
foreach (int i in e) sum += i;
72+
return sum;
73+
}
74+
75+
[Benchmark]
76+
public int foreach_static_array()
77+
{
78+
int sum = 0;
79+
foreach (int i in s_array) sum += i;
80+
return sum;
81+
}
82+
83+
[Benchmark]
84+
public int foreach_static_array_via_local()
85+
{
86+
int[] e = s_array;
87+
int sum = 0;
88+
foreach (int i in e) sum += i;
89+
return sum;
90+
}
91+
92+
[Benchmark]
93+
public int foreach_static_array_via_interface()
94+
{
95+
IEnumerable<int> e = s_array;
96+
int sum = 0;
97+
foreach (int i in e) sum += i;
98+
return sum;
99+
}
100+
101+
[Benchmark]
102+
public int foreach_static_array_via_interface_property()
103+
{
104+
IEnumerable<int> e = get_static_array();
105+
int sum = 0;
106+
foreach (int i in e) sum += i;
107+
return sum;
108+
}
109+
110+
[Benchmark]
111+
public int foreach_member_array()
112+
{
113+
int sum = 0;
114+
foreach (int i in m_array) sum += i;
115+
return sum;
116+
}
117+
118+
[Benchmark]
119+
public int foreach_member_array_via_local()
120+
{
121+
int[] e = m_array;
122+
int sum = 0;
123+
foreach (int i in e) sum += i;
124+
return sum;
125+
}
126+
127+
[Benchmark]
128+
public int foreach_member_array_via_interface()
129+
{
130+
IEnumerable<int> e = m_array;
131+
int sum = 0;
132+
foreach (int i in e) sum += i;
133+
return sum;
134+
}
135+
136+
[Benchmark]
137+
public int foreach_member_array_via_interface_property()
138+
{
139+
IEnumerable<int> e = get_member_array();
140+
int sum = 0;
141+
foreach (int i in e) sum += i;
142+
return sum;
143+
}
144+
145+
[Benchmark]
146+
public int foreach_opaque_array_via_interface()
147+
{
148+
IEnumerable<int> e = get_opaque_array();
149+
int sum = 0;
150+
foreach (int i in e) sum += i;
151+
return sum;
152+
}
153+
154+
[Benchmark]
155+
public int sum_static_array_via_local()
156+
{
157+
int[] a = s_array;
158+
IEnumerable<int> e = a;
159+
return e.Sum();
160+
}
161+
}
162+

0 commit comments

Comments
 (0)