Skip to content

Instantly share code, notes, and snippets.

@teoadal
Created June 8, 2023 18:36
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 teoadal/fbf06ac7d8216275780f21d8094e5eba to your computer and use it in GitHub Desktop.
Save teoadal/fbf06ac7d8216275780f21d8094e5eba to your computer and use it in GitHub Desktop.
using System.Collections.Generic;
using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Jobs;
using Benchmarks.Mocks;
namespace Benchmarks;
[SimpleJob(RuntimeMoniker.Net70)]
[MeanColumn, MemoryDiagnoser]
public class ListInitializerBenchmark
{
[Benchmark]
public int AddRange()
{
var list = new List<ClassMock>();
list.AddRange(_values);
return list.Count;
}
[Benchmark]
public int AsEnumerable()
{
var list = new List<ClassMock>(_values);
return list.Count;
}
[Benchmark(Baseline = true)]
public int Initializer()
{
var values = _values;
var list = new List<ClassMock>
{
values[0],
values[1],
values[2],
values[3],
values[4],
};
return list.Count;
}
[Benchmark]
public int WithoutInitializer()
{
var values = _values;
var list = new List<ClassMock>();
list.Add(values[0]);
list.Add(values[1]);
list.Add(values[2]);
list.Add(values[3]);
list.Add(values[4]);
return list.Count;
}
private ClassMock[] _values = null!;
[GlobalSetup]
public void Init()
{
_values = new ClassMock[5];
for (var i = 0; i < _values.Length; i++)
{
_values[i] = new ClassMock(
new[] {new object(), new object()},
true,
i,
new object());
}
}
}
internal sealed class ClassMock
{
public readonly object[] Array;
public readonly bool Bool;
public readonly int Int;
public readonly object Obj;
public ClassMock(object[] array, bool b, int i, object obj)
{
Array = array;
Bool = b;
Int = i;
Obj = obj;
}
}
@teoadal
Copy link
Author

teoadal commented Jun 8, 2023

BenchmarkDotNet=v0.13.5, OS=Windows 11 (10.0.22621.1702/22H2/2022Update/SunValley2)
AMD Ryzen 7 5800H with Radeon Graphics, 1 CPU, 16 logical and 8 physical cores
.NET SDK=7.0.203
  [Host]   : .NET 7.0.5 (7.0.523.17405), X64 RyuJIT AVX2
  .NET 7.0 : .NET 7.0.5 (7.0.523.17405), X64 RyuJIT AVX2

Job=.NET 7.0  Runtime=.NET 7.0  
Method Mean Error StdDev Ratio RatioSD Gen0 Allocated Alloc Ratio
AddRange 35.61 ns 0.721 ns 0.802 ns 0.81 0.02 0.0114 96 B 0.55
AsEnumerable 27.76 ns 0.210 ns 0.164 ns 0.63 0.02 0.0114 96 B 0.55
Initializer 44.03 ns 0.880 ns 1.316 ns 1.00 0.00 0.0210 176 B 1.00
ToList 31.52 ns 0.442 ns 0.414 ns 0.71 0.02 0.0114 96 B 0.55
WithoutInitializer 44.39 ns 0.889 ns 0.988 ns 1.01 0.03 0.0210 176 B 1.00

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment