11using BenchmarkDotNet . Attributes ;
22using BenchmarkDotNet . Jobs ;
33using System ;
4+ using System . Numerics ;
45using System . Runtime . CompilerServices ;
6+ using System . Runtime . InteropServices ;
57
68namespace NetFabric . Hyperlinq . Benchmarks . Benchmarks
79{
@@ -35,11 +37,10 @@ public int Foreach()
3537 public int For ( )
3638 {
3739 var source = array ! ;
38- var len = array ! . Length - 1 ;
3940 var sum = 0 ;
4041 // ReSharper disable once ForCanBeConvertedToForeach
4142 // ReSharper disable once LoopCanBeConvertedToQuery
42- for ( var index = 0 ; index <= len ; index ++ )
43+ for ( var index = 0 ; index <= source . Length - 1 ; index ++ )
4344 {
4445 var item = source [ index ] ;
4546 sum += item ;
@@ -67,19 +68,22 @@ public unsafe int For_Unsafe()
6768 public int ForAdamczewski ( )
6869 {
6970 var source = array ! ;
70- var len = source . Length - 1 ;
7171 var sum1 = 0 ;
7272 var sum2 = 0 ;
73- for ( var index = 0 ; index <= len ; index += 2 )
73+ for ( var index = 0 ; index <= source . Length - 2 ; index += 2 )
7474 {
7575 long i1 = index + 0 ;
7676 long i2 = index + 1 ;
7777 var c = source [ i1 ] ;
7878 var d = source [ i2 ] ;
79-
79+
8080 sum1 += c ;
8181 sum2 += d ;
8282 }
83+ if ( ( source . Length & 0x01 ) != 0 )
84+ {
85+ sum1 += source [ source . Length - 1 ] ;
86+ }
8387 return sum1 + sum2 ;
8488 }
8589
@@ -88,7 +92,7 @@ public unsafe int ForAdamczewskiUnsafe()
8892 {
8993 fixed ( int * source = array )
9094 {
91- var len = array ! . Length - 1 ;
95+ var len = array ! . Length - 2 ;
9296 var sum1 = 0 ;
9397 var sum2 = 0 ;
9498 for ( var index = 0 ; index <= len ; index += 2 )
@@ -101,6 +105,10 @@ public unsafe int ForAdamczewskiUnsafe()
101105 sum1 += c ;
102106 sum2 += d ;
103107 }
108+ if ( ( array . Length & 0x01 ) != 0 )
109+ {
110+ sum1 += source [ array ! . Length - 1 ] ;
111+ }
104112 return sum1 + sum2 ;
105113 }
106114 }
@@ -154,14 +162,33 @@ public int ArraySegment_AsSpan()
154162 public int ArraySegment_AsArray ( )
155163 {
156164 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 ;
160166 var sum = 0 ;
161- for ( var index = start ; index < end && index <= len ; index ++ )
167+ for ( var index = segment . Offset ; index < end ; index ++ )
162168 sum += source [ index ] ;
163169 return sum ;
164170 }
165171
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+ }
166193 }
167194}
0 commit comments