• 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 }
  • 相关阅读:
    (x^n-1)在实数域上的标准分解
    子数列收敛定理(任何有界数列必有收敛子数列)
    Islamic empire
    Cauchy收敛准则
    Islamic
    用上下极限判定数列的算数平均值的极限
    妞妞打车之最多的硬币
    信仰1056
    棋盘游戏
    取石子的游戏
  • 原文地址:https://www.cnblogs.com/Bob-wei/p/13399757.html
Copyright © 2020-2023  润新知