Created
January 20, 2021 13:14
-
-
Save badamczewski/7ff6b085b5f49165e407a425d13384de to your computer and use it in GitHub Desktop.
sum.cs
This file contains hidden or 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
| public class BenchSum | |
| { | |
| private int[] _values; | |
| [GlobalSetup] | |
| public void Setup() | |
| { | |
| _values = new int[1024]; | |
| } | |
| [Benchmark(Baseline = true)] | |
| public int Foreach() | |
| { | |
| var values = _values; | |
| int result = 0; | |
| foreach (var value in values) | |
| { | |
| result += value; | |
| } | |
| return result; | |
| } | |
| [Benchmark] | |
| public int For() | |
| { | |
| var values = _values; | |
| int result = 0; | |
| for (int i = 0; i < values.Length; i++) | |
| { | |
| result += values[i]; | |
| } | |
| return result; | |
| } | |
| [Benchmark] | |
| public int For2Ports() | |
| { | |
| var values = _values; | |
| int result1 = 0; | |
| int result2 = 0; | |
| for (int i = 0; i < values.Length; i += 2) | |
| { | |
| result1 += values[i]; | |
| result2 += values[i + 1]; | |
| } | |
| return result1 + result2; | |
| } | |
| [Benchmark] | |
| public unsafe int For2Ports_NoNullCheck() | |
| { | |
| var len = _values.Length; | |
| int result1 = 0; | |
| int result2 = 0; | |
| fixed (int* pin = _values) | |
| { | |
| int* values = pin; | |
| for (int i = 0; i < len; i += 2) | |
| { | |
| result1 += values[i]; | |
| result2 += values[i + 1]; | |
| values += 2; | |
| } | |
| } | |
| return result1 + result2; | |
| } | |
| [Benchmark] | |
| public unsafe int For2Ports_NoZeroExtendAndNullChecks() | |
| { | |
| var len = _values.Length; | |
| int result1 = 0; | |
| int result2 = 0; | |
| fixed (int* pin = _values) | |
| { | |
| int* values = pin; | |
| for (int i = 0; i < len; i += 2) | |
| { | |
| result1 += *values; | |
| result2 += *(values + 1); | |
| values += 2; | |
| } | |
| } | |
| return result1 + result2; | |
| } | |
| [Benchmark] | |
| public unsafe int For4Ports_NoZeroExtendAndNullChecks() | |
| { | |
| var len = _values.Length; | |
| int result1 = 0; | |
| int result2 = 0; | |
| int result3 = 0; | |
| int result4 = 0; | |
| fixed (int* pin = _values) | |
| { | |
| long* values = (long*)pin; | |
| for (int i = 0; i < len; i += 2) | |
| { | |
| result1 += (int)(*values >> 32); | |
| result2 += (int)(*values & 0xFFFFFFFF); | |
| values++; | |
| result3 += (int)(*values >> 32); | |
| result4 += (int)(*values & 0xFFFFFFFF); | |
| values++; | |
| } | |
| } | |
| return result1 + result2 + result3 + result4; | |
| } | |
| [Benchmark] | |
| public int LinqSum() | |
| { | |
| var values = _values; | |
| var result = values.Sum(x => x); | |
| return result; | |
| } | |
| [Benchmark] | |
| public int LinqAgg() | |
| { | |
| var values = _values; | |
| var result = values.Aggregate(0, (acc, x) => acc + x); | |
| return result; | |
| } | |
| [Benchmark] | |
| public int SIMD() | |
| { | |
| var values = _values; | |
| Vector<int> vsum = new Vector<int>(0); | |
| for (int i = 0; i < values.Length; i += Vector<int>.Count) | |
| { | |
| var value = new Vector<int>(values, i); | |
| vsum = vsum + (value); | |
| } | |
| int result = 0; | |
| for (int i = 0; i < Vector<double>.Count; i++) | |
| { | |
| result += vsum[i]; | |
| } | |
| return result; | |
| } | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment