zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    商品
    正向代理和反向代理
    JS中的bind方法
    本地安装并运行http-server、browser-sync、webpack
    NPM——常用命令
    两层遍历的递归写法
    vue-cli中的index.html ,main.js , App.vue的关系
    NPM的由来——为什么要使用NPM
    关于this的指向
    MapReduce编程模型详解(基于Windows平台Eclipse)
  • 原文地址:https://www.cnblogs.com/Bob-wei/p/13399757.html
Copyright © 2011-2022 走看看