Skip to content

Instantly share code, notes, and snippets.

@badamczewski
Created January 20, 2021 13:14
Show Gist options
  • Select an option

  • Save badamczewski/7ff6b085b5f49165e407a425d13384de to your computer and use it in GitHub Desktop.

Select an option

Save badamczewski/7ff6b085b5f49165e407a425d13384de to your computer and use it in GitHub Desktop.
sum.cs
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