.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
}

测试结果:

在.Net 8中增加的内联数组,分别和托管堆及使用直接在栈上分配内存性能对比

秋风 2023-09-13