.Net 8中的内联数组
前言
学习一下.Net 8.0中新增的内联数组,使用感觉有点别扭,不过内联数组不使用托管堆,在栈上分配,在需要的性能地方上,还是可以使用的.在栈分配内存的话,内存都是有限制的,目前限制为1MB,其实之前通过stackalloc 也可以在栈上分配数组,不过要指定unsafe后,才可以使用.下面看这几种使用方式和性能对比.代码
using System.Runtime.CompilerServices;
using BenchmarkDotNet.Attributes;
namespace CSharpBenchmarks.ArrayTest
{
[MemoryDiagnoser]
[DisassemblyDiagnoser(printSource: true)]
public class InlineArrayTest
{
[Params(10, 100, 1000)]
public int Count { get; set; }
[Benchmark(Baseline = true)]
public void TestArray1()
{
for (int i = 0; i < Count; i++)
{
var arr = new int[10]; //在托管堆分配int类型数组,长度为10
for (int j = 0; j < arr.Length; j++)
{
arr[j] = j;
}
}
}
[Benchmark]
public unsafe void TestArray2()
{
for (int i = 0; i < Count; i++)
{
var arr = stackalloc int[10]; //在栈上分配int类型数组,长度为10
for (int j = 0; j < 10; j++)
{
arr[j] = j;
}
}
}
[Benchmark]
public void TestArray3()
{
for (int i = 0; i < Count; i++)
{
Test1 arr = new Test1();
for (int j = 0; j < Test1.Length; j++)
{
arr[j] = j;
}
}
}
}
#if NET8_0_OR_GREATER
[InlineArray(Length)] //内联数组,并指定数组的长度,这个用法还是有点怪怪的
public struct Test1
{
public const int Length = 10;
public int x;
}
#endif
}
测试结果:
秋风
2023-09-13