|
using BenchmarkDotNet.Attributes; |
|
using BenchmarkDotNet.Columns; |
|
using BenchmarkDotNet.Configs; |
|
using BenchmarkDotNet.Order; |
|
using BenchmarkDotNet.Reports; |
|
using NetFabric.Numerics; |
|
using System.Runtime.InteropServices; |
|
using System.Runtime.CompilerServices; |
|
|
|
[Config(typeof(Config))] |
|
[MemoryDiagnoser] |
|
[Orderer(SummaryOrderPolicy.FastestToSlowest)] |
|
[HideColumns(Column.EnvironmentVariables, Column.RatioSD, Column.Error)] |
|
[GroupBenchmarksBy(BenchmarkLogicalGroupRule.ByCategory)] |
|
[CategoriesColumn] |
|
public class PopulateArraysBenchmarks |
|
{ |
|
int[]? concatArray; |
|
int[]? copyToArray; |
|
List<int>? list; |
|
|
|
[Params(10_000)] |
|
public int ArraySize { get; set; } |
|
|
|
[GlobalSetup] |
|
public void GlobalSetup() |
|
{ |
|
var source = Enumerable.Range(0, ArraySize); |
|
concatArray = source.ToArray(); |
|
copyToArray = source.ToArray(); |
|
list = source.ToList(); |
|
} |
|
|
|
[Benchmark(Baseline = true)] |
|
[BenchmarkCategory("Manual")] |
|
public int[] ArrayIndexInitializer() |
|
=> AddValuesToArrayMethods.ArrayIndexInitializer(ArraySize); |
|
|
|
[Benchmark] |
|
[BenchmarkCategory("Manual")] |
|
public int[] ArrayIndexInitializer2() |
|
=> AddValuesToArrayMethods.ArrayIndexInitializer2(ArraySize); |
|
|
|
[Benchmark] |
|
[BenchmarkCategory("Manual")] |
|
public int[] SetValueMethod() |
|
=> AddValuesToArrayMethods.SetValueMethod(ArraySize); |
|
|
|
[Benchmark(Baseline = true)] |
|
[BenchmarkCategory("Populated Collection")] |
|
public int[] ListCollection() |
|
=> AddValuesToArrayMethods.UsingList(list!); |
|
|
|
[Benchmark] |
|
[BenchmarkCategory("Populated Collection")] |
|
public int[] LinqConcat() |
|
=> AddValuesToArrayMethods.LinqConcat(concatArray!); |
|
|
|
[Benchmark] |
|
[BenchmarkCategory("Populated Collection")] |
|
public int[] ArrayCopyToMethod() |
|
=> AddValuesToArrayMethods.ArrayCopyToMethod(ArraySize, copyToArray!); |
|
|
|
[Benchmark(Baseline = true)] |
|
[BenchmarkCategory("Collection Projection")] |
|
public int[] ArraySelectToArray() |
|
=> copyToArray!.Select(item => item * 2).ToArray(); |
|
|
|
[Benchmark] |
|
[BenchmarkCategory("Collection Projection")] |
|
public int[] ListSelectToArray() |
|
=> list!.Select(item => item * 2).ToArray(); |
|
|
|
[Benchmark] |
|
[BenchmarkCategory("Collection Projection")] |
|
public int[] SpanTensor() |
|
=> AddValuesToArrayMethods.SpanTensor(copyToArray!); |
|
|
|
[Benchmark] |
|
[BenchmarkCategory("Collection Projection")] |
|
public int[] ListAsSpanTensor() |
|
=> AddValuesToArrayMethods.ListAsSpanTensor(list!); |
|
} |
|
|
|
public static class AddValuesToArrayMethods |
|
{ |
|
public static int[] ArrayIndexInitializer(int arraySize) |
|
{ |
|
var array = new int[arraySize]; |
|
for (var index = 0; index < arraySize; index++) |
|
array[index] = index; |
|
return array; |
|
} |
|
|
|
public static int[] ArrayIndexInitializer2(int arraySize) |
|
{ |
|
var array = new int[arraySize]; |
|
for (var index = 0; index < array.Length; index++) |
|
array[index] = index; |
|
return array; |
|
} |
|
|
|
public static int[] SetValueMethod(int arraySize) |
|
{ |
|
var array = new int[arraySize]; |
|
for (var index = 0; index < arraySize; index++) |
|
array.SetValue(value: index, index: index); |
|
return array; |
|
} |
|
|
|
public static int[] ArrayCopyToMethod(int arraySize, int[] array) |
|
{ |
|
var array1 = new int[arraySize]; |
|
array.CopyTo(array1, 0); |
|
return array1; |
|
} |
|
|
|
public static int[] UsingList(List<int> list) |
|
=> list.ToArray(); |
|
|
|
public static int[] LinqConcat(int[] array) |
|
=> Array.Empty<int>().Concat(array).ToArray(); |
|
|
|
public static int[] SpanTensor(ReadOnlySpan<int> source) |
|
{ |
|
var array = new int[source.Length]; |
|
Tensor.Multiply(source, 2, array); |
|
return array; |
|
} |
|
|
|
public static int[] ListAsSpanTensor(List<int> list) |
|
=> SpanTensor(CollectionsMarshal.AsSpan(list)); |
|
|
|
} |
|
|
|
class Config : ManualConfig |
|
{ |
|
public Config() |
|
=> WithSummaryStyle(SummaryStyle.Default.WithRatioStyle(RatioStyle.Trend)); |
|
} |