C# 7.2 中 In参数( in parameter )的性能比较
结论:in参数的性能要优于普通参数非常多。
如下图所示,分别创建 40 和 10000 个结构体,进行下面的测试:
- InParameters: 使用in参数调用方法
- InParameters2: 使用in参数调用方法(调用方没有使用in关键字,因为是可选的,因此和InParameters结果一样)
- Normal: 普通调用方法
测试代码:
1 using BenchmarkDotNet.Attributes; 2 3 namespace RectangleGameCore.Benchmarks 4 { 5 /// <summary> 6 /// 测试CSharp的In参数性能 7 /// </summary> 8 [MemoryDiagnoser] 9 [RPlotExporter] 10 [BenchmarkCategory("CSharp", "InParameter")] 11 public class CSharpInParameter 12 { 13 [Params(40, 10_000)] 14 public int N; 15 16 private MyStruct[] src; 17 private int[] dst; 18 19 [GlobalSetup] 20 public void Setup() 21 { 22 src = new MyStruct[N]; 23 dst = new int[N]; 24 } 25 26 [Benchmark(Baseline = true)] 27 public void Normal() 28 { 29 for (var i = N - 1; i >= 0; i--) 30 { 31 dst[i] = DoSomeThing(src[i]); 32 } 33 } 34 35 [Benchmark] 36 public void InParameter() 37 { 38 for (var i = N - 1; i >= 0; i--) 39 { 40 dst[i] = DoSomeThing(in src[i]); 41 } 42 } 43 44 [Benchmark] 45 public void InParameter2() 46 { 47 for (var i = N - 1; i >= 0; i--) 48 { 49 dst[i] = DoSomeThing2(src[i]); 50 } 51 } 52 53 private static int DoSomeThing(MyStruct s) => s.X + s.Y + s.Z; 54 private static int DoSomeThing(in MyStruct s) => s.X + s.Y + s.Z; 55 private static int DoSomeThing2(in MyStruct s) => s.X + s.Y + s.Z; 56 57 58 private readonly struct MyStruct 59 { 60 public int X { get; } 61 public int Y { get; } 62 public int Z { get; } 63 64 public MyStruct(int N) 65 { 66 X = N; 67 Y = N; 68 Z = N; 69 } 70 } 71 } 72 }