Skip to content

Instantly share code, notes, and snippets.

@AndreyAkinshin
Created December 10, 2018 15:32
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save AndreyAkinshin/4c9e0193912c99c0b314359d5c5d0a4e to your computer and use it in GitHub Desktop.
Save AndreyAkinshin/4c9e0193912c99c0b314359d5c5d0a4e to your computer and use it in GitHub Desktop.
using System;
using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Running;
namespace ConsoleApp3
{
internal class ReferenceType
{
public int Value;
}
internal struct ValueType
{
public int Value;
}
internal struct ExtendedValueType
{
public int Value;
private double _otherData;
}
[SimpleJob(warmupCount:30, targetCount:30)]
public class ClassVsStruct
{
private ReferenceType[] _referenceTypeData;
private ValueType[] _valueTypeData;
private ExtendedValueType[] _extendedValueTypeData;
private int[] _data;
[Params(256/*, 500, 1000 , 10000, 100_000*/)]
public int Size { get; set; }
[GlobalSetup]
public void GlobalSetup()
{
_referenceTypeData = new ReferenceType[Size];
_valueTypeData = new ValueType[Size];
_extendedValueTypeData = new ExtendedValueType[Size];
_data = new int[Size];
var random = new Random();
for (var i = 0; i < Size; i++)
{
_data[i] = random.Next(100000);
_referenceTypeData[i] = new ReferenceType {Value = _data[i]};
_valueTypeData[i] = new ValueType {Value = _data[i]};
_extendedValueTypeData[i] = new ExtendedValueType {Value = _data[i]};
}
}
[Benchmark(Baseline = true)]
public int ReferenceTypeSum()
{
var sum = 0;
for (var i = 0; i < Size; i += 16)
{
sum += _referenceTypeData[i].Value;
sum += _referenceTypeData[i + 1].Value;
sum += _referenceTypeData[i + 2].Value;
sum += _referenceTypeData[i + 3].Value;
sum += _referenceTypeData[i + 4].Value;
sum += _referenceTypeData[i + 5].Value;
sum += _referenceTypeData[i + 6].Value;
sum += _referenceTypeData[i + 7].Value;
sum += _referenceTypeData[i + 8].Value;
sum += _referenceTypeData[i + 9].Value;
sum += _referenceTypeData[i + 10].Value;
sum += _referenceTypeData[i + 11].Value;
sum += _referenceTypeData[i + 12].Value;
sum += _referenceTypeData[i + 13].Value;
sum += _referenceTypeData[i + 14].Value;
sum += _referenceTypeData[i + 15].Value;
}
return sum;
}
[Benchmark]
public int ValueTypeSum()
{
var sum = 0;
for (var i = 0; i < Size; i += 16)
{
sum += _valueTypeData[i].Value;
sum += _valueTypeData[i + 1].Value;
sum += _valueTypeData[i + 2].Value;
sum += _valueTypeData[i + 3].Value;
sum += _valueTypeData[i + 4].Value;
sum += _valueTypeData[i + 5].Value;
sum += _valueTypeData[i + 6].Value;
sum += _valueTypeData[i + 7].Value;
sum += _valueTypeData[i + 8].Value;
sum += _valueTypeData[i + 9].Value;
sum += _valueTypeData[i + 10].Value;
sum += _valueTypeData[i + 11].Value;
sum += _valueTypeData[i + 12].Value;
sum += _valueTypeData[i + 13].Value;
sum += _valueTypeData[i + 14].Value;
sum += _valueTypeData[i + 15].Value;
}
return sum;
}
[Benchmark]
public int ExtendedValueTypeSum()
{
var sum = 0;
for (var i = 0; i < Size; i += 16)
{
sum += _extendedValueTypeData[i].Value;
sum += _extendedValueTypeData[i + 1].Value;
sum += _extendedValueTypeData[i + 2].Value;
sum += _extendedValueTypeData[i + 3].Value;
sum += _extendedValueTypeData[i + 4].Value;
sum += _extendedValueTypeData[i + 5].Value;
sum += _extendedValueTypeData[i + 6].Value;
sum += _extendedValueTypeData[i + 7].Value;
sum += _extendedValueTypeData[i + 8].Value;
sum += _extendedValueTypeData[i + 9].Value;
sum += _extendedValueTypeData[i + 10].Value;
sum += _extendedValueTypeData[i + 11].Value;
sum += _extendedValueTypeData[i + 12].Value;
sum += _extendedValueTypeData[i + 13].Value;
sum += _extendedValueTypeData[i + 14].Value;
sum += _extendedValueTypeData[i + 15].Value;
}
return sum;
}
}
class Program
{
static void Main(string[] args)
{
BenchmarkRunner.Run<ClassVsStruct>();
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment