Skip to content

Commit e78d541

Browse files
committed
Add Vector benchmarks
1 parent 6a7e3e3 commit e78d541

File tree

2 files changed

+49
-21
lines changed

2 files changed

+49
-21
lines changed

Benchmarks/ArrayIterationBenchmarks.md

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -18,20 +18,21 @@ BenchmarkDotNet=v0.13.0.1555-nightly, OS=Windows 10.0.19043.1081 (21H1/May2021Up
1818
Intel Core i7-7567U CPU 3.50GHz (Kaby Lake), 1 CPU, 4 logical and 2 physical cores
1919
.NET SDK=6.0.100-preview.5.21302.13
2020
[Host] : .NET 6.0.0 (6.0.21.30105), X64 RyuJIT
21-
Job-IRYCMS : .NET 6.0.0 (6.0.21.30105), X64 RyuJIT
21+
Job-UGMGOQ : .NET 6.0.0 (6.0.21.30105), X64 RyuJIT
2222

2323
Runtime=.NET 6.0
2424

2525
```
2626
| Method | Count | Mean | Error | StdDev | Ratio | RatioSD | Gen 0 | Gen 1 | Gen 2 | Allocated |
2727
|--------------------- |-------- |-----------:|---------:|--------:|-------------:|--------:|------:|------:|------:|----------:|
28-
| Foreach | 1000000 | 424.2 μs | 5.91 μs | 5.53 μs | baseline | | - | - | - | - |
29-
| For | 1000000 | 428.7 μs | 2.69 μs | 2.52 μs | 1.01x slower | 0.01x | - | - | - | - |
30-
| For_Unsafe | 1000000 | 412.9 μs | 3.31 μs | 2.76 μs | 1.03x faster | 0.01x | - | - | - | - |
31-
| ForAdamczewski | 1000000 | 404.1 μs | 2.42 μs | 2.26 μs | 1.05x faster | 0.02x | - | - | - | - |
32-
| ForAdamczewskiUnsafe | 1000000 | 355.1 μs | 3.48 μs | 3.25 μs | 1.19x faster | 0.02x | - | - | - | - |
33-
| Span | 1000000 | 411.8 μs | 2.92 μs | 2.28 μs | 1.03x faster | 0.01x | - | - | - | - |
34-
| ArraySegment_Foreach | 1000000 | 2,800.7 μs | 10.24 μs | 9.08 μs | 6.60x slower | 0.09x | - | - | - | 1 B |
35-
| ArraySegment_For | 1000000 | 805.2 μs | 4.48 μs | 4.19 μs | 1.90x slower | 0.02x | - | - | - | - |
36-
| ArraySegment_AsSpan | 1000000 | 412.4 μs | 2.08 μs | 1.74 μs | 1.03x faster | 0.01x | - | - | - | - |
37-
| ArraySegment_AsArray | 1000000 | 798.7 μs | 4.39 μs | 3.67 μs | 1.88x slower | 0.03x | - | - | - | - |
28+
| Foreach | 1000000 | 411.6 μs | 3.58 μs | 2.99 μs | baseline | | - | - | - | - |
29+
| For | 1000000 | 410.3 μs | 1.57 μs | 1.22 μs | 1.00x faster | 0.01x | - | - | - | - |
30+
| For_Unsafe | 1000000 | 411.1 μs | 1.58 μs | 1.48 μs | 1.00x faster | 0.01x | - | - | - | - |
31+
| ForAdamczewski | 1000000 | 404.1 μs | 1.83 μs | 1.53 μs | 1.02x faster | 0.01x | - | - | - | - |
32+
| ForAdamczewskiUnsafe | 1000000 | 411.2 μs | 1.93 μs | 1.71 μs | 1.00x faster | 0.01x | - | - | - | - |
33+
| Span | 1000000 | 411.1 μs | 1.74 μs | 1.36 μs | 1.00x faster | 0.01x | - | - | - | - |
34+
| ArraySegment_Foreach | 1000000 | 2,790.2 μs | 10.03 μs | 7.83 μs | 6.78x slower | 0.06x | - | - | - | 1 B |
35+
| ArraySegment_For | 1000000 | 801.6 μs | 2.79 μs | 2.33 μs | 1.95x slower | 0.02x | - | - | - | - |
36+
| ArraySegment_AsSpan | 1000000 | 410.4 μs | 1.33 μs | 1.24 μs | 1.00x faster | 0.01x | - | - | - | - |
37+
| ArraySegment_AsArray | 1000000 | 560.8 μs | 2.97 μs | 2.63 μs | 1.36x slower | 0.01x | - | - | - | - |
38+
| Vector | 1000000 | 104.3 μs | 0.54 μs | 0.50 μs | 3.95x faster | 0.04x | - | - | - | - |

NetFabric.Hyperlinq.Benchmarks/Benchmarks/ArrayIterationBenchmarks.cs

Lines changed: 37 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
using BenchmarkDotNet.Attributes;
22
using BenchmarkDotNet.Jobs;
33
using System;
4+
using System.Numerics;
45
using System.Runtime.CompilerServices;
6+
using System.Runtime.InteropServices;
57

68
namespace 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

Comments
 (0)