.Net 10中简化内敛数组

起因

在.Net 8增加内敛数组,在.Net 10简化部分使用内敛数组的场景. 在BCL中内置了常用内敛数组的类型,在使用的时候,就不需要先定义一个类型. 具体的issue:
  1. Add InlineArrayX types (#113403)
  2. Add `InlineArray16` (#114515)

可以看在.Net 10内置的内敛数组:
.Net 10 提供常用的内敛数组

测试代码

using System.Runtime.CompilerServices;
using BenchmarkDotNet.Attributes;

namespace CSharpBenchmarks.ArrayTest
{
	[MemoryDiagnoser]
	[DisassemblyDiagnoser(printSource: true)]
	public class InlineArray2Test
	{
		[Params(10, 100, 1000)]
		public int Count { get; set; }

		[Benchmark(Baseline = true)]
		public void TestArray1()
		{
			for (int i = 0; i < Count; i++)
			{
				Test1 arr = new();  //内联数组 .
				for (int j = 0; j < Test1.Length; j++)
				{
					arr[j] = j;
				}
			}
		}

		[Benchmark]
		public void TestArray2()
		{
			for (int i = 0; i < Count; i++)
			{
				InlineArray10<int> arr = new(); //.Net 10 内置数组长度2-16的泛型内敛数组
				for (int j = 0; j < 10; j++)
				{
					arr[j] = j;
				}
			}
		}


	}

#if NET8_0_OR_GREATER
	[InlineArray(Length)]    //内联数组,并指定数组的长度,这个用法还是有点怪怪的
	public struct Test1
	{
		public const int Length = 10;
		public int x;
	}
#endif
}

性能基准测试结果:

.Net 10 内置的内敛数组和自定义的内敛数组性能对比

通过BenchmarkDotNet对自定义内敛数组和内置的内敛数组性能测试,发现使用频率低的时候,内置比自定义有2%和3%的差异.在较高频率时,内置内敛数组比自定义内敛数组的性能下降8%.其实差异不是很大.

秋风 2025-04-26