1
1
using BenchmarkDotNet . Attributes ;
2
2
using BenchmarkDotNet . Jobs ;
3
3
using System ;
4
+ using System . Numerics ;
4
5
using System . Runtime . CompilerServices ;
6
+ using System . Runtime . InteropServices ;
5
7
6
8
namespace NetFabric . Hyperlinq . Benchmarks . Benchmarks
7
9
{
@@ -35,11 +37,10 @@ public int Foreach()
35
37
public int For ( )
36
38
{
37
39
var source = array ! ;
38
- var len = array ! . Length - 1 ;
39
40
var sum = 0 ;
40
41
// ReSharper disable once ForCanBeConvertedToForeach
41
42
// ReSharper disable once LoopCanBeConvertedToQuery
42
- for ( var index = 0 ; index <= len ; index ++ )
43
+ for ( var index = 0 ; index <= source . Length - 1 ; index ++ )
43
44
{
44
45
var item = source [ index ] ;
45
46
sum += item ;
@@ -67,19 +68,22 @@ public unsafe int For_Unsafe()
67
68
public int ForAdamczewski ( )
68
69
{
69
70
var source = array ! ;
70
- var len = source . Length - 1 ;
71
71
var sum1 = 0 ;
72
72
var sum2 = 0 ;
73
- for ( var index = 0 ; index <= len ; index += 2 )
73
+ for ( var index = 0 ; index <= source . Length - 2 ; index += 2 )
74
74
{
75
75
long i1 = index + 0 ;
76
76
long i2 = index + 1 ;
77
77
var c = source [ i1 ] ;
78
78
var d = source [ i2 ] ;
79
-
79
+
80
80
sum1 += c ;
81
81
sum2 += d ;
82
82
}
83
+ if ( ( source . Length & 0x01 ) != 0 )
84
+ {
85
+ sum1 += source [ source . Length - 1 ] ;
86
+ }
83
87
return sum1 + sum2 ;
84
88
}
85
89
@@ -88,7 +92,7 @@ public unsafe int ForAdamczewskiUnsafe()
88
92
{
89
93
fixed ( int * source = array )
90
94
{
91
- var len = array ! . Length - 1 ;
95
+ var len = array ! . Length - 2 ;
92
96
var sum1 = 0 ;
93
97
var sum2 = 0 ;
94
98
for ( var index = 0 ; index <= len ; index += 2 )
@@ -101,6 +105,10 @@ public unsafe int ForAdamczewskiUnsafe()
101
105
sum1 += c ;
102
106
sum2 += d ;
103
107
}
108
+ if ( ( array . Length & 0x01 ) != 0 )
109
+ {
110
+ sum1 += source [ array ! . Length - 1 ] ;
111
+ }
104
112
return sum1 + sum2 ;
105
113
}
106
114
}
@@ -154,14 +162,33 @@ public int ArraySegment_AsSpan()
154
162
public int ArraySegment_AsArray ( )
155
163
{
156
164
var source = segment . Array ! ;
157
- var len = array ! . Length - 1 ;
158
- var start = segment . Offset ;
159
- var end = start + segment . Count ;
165
+ var end = segment . Offset + segment . Count ;
160
166
var sum = 0 ;
161
- for ( var index = start ; index < end && index <= len ; index ++ )
167
+ for ( var index = segment . Offset ; index < end ; index ++ )
162
168
sum += source [ index ] ;
163
169
return sum ;
164
170
}
165
171
172
+ [ Benchmark ]
173
+ public int Vector ( )
174
+ {
175
+ var source = array ! ;
176
+ var sum = 0 ;
177
+ var vectors = MemoryMarshal . Cast < int , Vector < int > > ( source ) ;
178
+ var vectorSum = Vector < int > . Zero ;
179
+
180
+ foreach ( var vector in vectors )
181
+ vectorSum += vector ;
182
+
183
+ for ( var index = 0 ; index < Vector < int > . Count ; index ++ )
184
+ sum += vectorSum [ index ] ;
185
+
186
+ for ( var index = source . Length - ( source . Length % Vector < int > . Count ) ; index < source . Length ; index ++ )
187
+ {
188
+ var item = source [ index ] ;
189
+ sum += item ;
190
+ }
191
+ return sum ;
192
+ }
166
193
}
167
194
}
0 commit comments