Skip to content

Instantly share code, notes, and snippets.

@kshyju
Created October 20, 2020 18:09
Show Gist options
  • Save kshyju/2c2e46cfa1faf769a915410a08e4f465 to your computer and use it in GitHub Desktop.
Save kshyju/2c2e46cfa1faf769a915410a08e4f465 to your computer and use it in GitHub Desktop.
IReadOnlyList ForEach vs Array ForLoop - allocation
Result
``` ini
BenchmarkDotNet=v0.12.1, OS=Windows 10.0.19042
Intel Xeon CPU E5-1650 v4 3.60GHz, 1 CPU, 12 logical and 6 physical cores
.NET Core SDK=5.0.100-rc.2.20479.15
[Host] : .NET Core 3.1.9 (CoreCLR 4.700.20.47201, CoreFX 4.700.20.47203), X64 RyuJIT
DefaultJob : .NET Core 3.1.9 (CoreCLR 4.700.20.47201, CoreFX 4.700.20.47203), X64 RyuJIT
```
| Method | Mean | Error | StdDev | Gen 0 | Gen 1 | Gen 2 | Allocated |
|-------------------------- |---------:|---------:|---------:|-------:|------:|------:|----------:|
| MergeIReadonlyListForloop | 90.64 ns | 1.894 ns | 4.501 ns | 0.0285 | - | - | 224 B |
| MergeIReadonlyListForEach | 87.03 ns | 1.796 ns | 3.145 ns | 0.0325 | - | - | 256 B |
| MergeArrayForLoop | 48.62 ns | 1.021 ns | 1.560 ns | 0.0286 | - | - | 224 B |
Code used
using BenchmarkDotNet.Attributes;
using System.Collections.Generic;
namespace Benchmark_ToListCall
{
[MemoryDiagnoser]
public class CollectionBenchmarks2
{
public class WebComponent
{
public int Id { set; get; }
public string Name { set; get; }
public int Position { set; get; }
}
private int[] positions;
private WebComponent[] components = new WebComponent[5];
[GlobalSetup]
public void GlobalSetup()
{
components[0] = new WebComponent { Id = 1, Name = "A", Position = 1 };
components[1] = new WebComponent { Id = 2, Name = "B", Position = 2 };
components[2] = new WebComponent { Id = 3, Name = "C", Position = 3 };
components[3] = new WebComponent { Id = 4, Name = "D", Position = 4 };
components[4] = new WebComponent { Id = 5, Name = "E", Position = 5 };
positions = new int[] { 2, 4, 6, 8, 10 };
}
[Benchmark]
public WebComponent[] MergeIReadonlyListForloop()
{
return this.MergeIReadonlyListForloop(this.components, this.positions);
}
[Benchmark]
public WebComponent[] MergeIReadonlyListForEach()
{
return this.MergeIReadonlyListForEach(this.components, this.positions);
}
[Benchmark]
public WebComponent[] MergeArrayForLoop()
{
return this.MergeArrayForLoop(this.components, this.positions);
}
private WebComponent[] MergeIReadonlyListForloop(IReadOnlyList<WebComponent> components, int[] positions)
{
var combinedComponents = new WebComponent[components.Count];
for (int i = 0; i < components.Count; i++)
{
var webComponent = new WebComponent
{
Name = components[i].Name,
Position = positions[i]
};
combinedComponents[i] = webComponent;
}
return combinedComponents;
}
private WebComponent[] MergeIReadonlyListForEach(IReadOnlyList<WebComponent> components, int[] positions)
{
var combinedComponents = new WebComponent[components.Count];
int i = 0;
foreach(var item in components)
{
var webComponent = new WebComponent
{
Name = item.Name,
Position = positions[i]
};
combinedComponents[i] = webComponent;
i++;
}
return combinedComponents;
}
private WebComponent[] MergeArrayForLoop(WebComponent[] components, int[] positions)
{
var combinedComponents = new WebComponent[components.Length];
for (int i = 0; i < components.Length; i++)
{
var webComponent = new WebComponent
{
Name = components[i].Name,
Position = positions[i]
};
combinedComponents[i] = webComponent;
}
return combinedComponents;
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment