Created
October 20, 2020 18:09
-
-
Save kshyju/2c2e46cfa1faf769a915410a08e4f465 to your computer and use it in GitHub Desktop.
IReadOnlyList ForEach vs Array ForLoop - allocation
This file contains 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
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