MethodImpl优化性能

参数解释
MethodImplOptions.AggressiveInlining:请求编译器在可能的情况下对方法进行内联。

MethodImpl:这是一个属性,允许开发者为方法指定特定的实现行为,比如请求内联、忽略栈追踪等。

内联的作用
内联的主要作用是提升性能,特别是在如下情况下:

消除方法调用开销:通常方法调用需要进行参数传递和栈帧管理等操作,内联可以省去这些开销。
减少分支跳转:内联将方法体直接插入到调用代码中,减少了方法调用产生的分支跳转。
优化内存使用:在较小的、频繁调用的方法上,内联能降低方法调用对栈的负担,进一步优化运行时内存使用。
使用内联的典型场景
AggressiveInlining 常用在一些简单的、频繁调用的 辅助方法或属性 上,比如:

简单的数学运算函数
小型的帮助方法(如字符串处理)
属性 Getter 和 Setter,尤其在属性只是简单的字段返回或赋值时
内联适合的场景与限制
虽然 AggressiveInlining 可以显著提升小型方法的性能,但编译器可能会根据情况选择不内联该方法,特别是在以下情况下:

方法体较大:内联会导致调用方代码量增大。如果一个方法代码体积过大,编译器可能会忽略 AggressiveInlining 请求,以避免生成的代码过于庞大。
递归方法:对于递归方法,内联并不适用,因为递归需要自身调用,无法单纯地替换成一段代码。
异常处理:方法包含复杂的异常处理逻辑时,内联会增加代码复杂度,编译器有时会避免内联这样的代码。

  [MethodImpl(MethodImplOptions.AggressiveInlining)]
  public static int InlineAdd(int x,int y)
  {
      return x + y;
  }
  public static int NotInlineAdd(int x,int y)
  {
      return x + y;
  }
  static int TestInlineAdd()
  {
      int result = 0;
      for(int i = 0; i < 1000000000; i++)
      {
          result = InlineAdd(result,i);
      }
      return result;
  }
  static int TestNotInlineAdd()
  {
      int result = 0;
      for (int i = 0; i < 1000000000; i++)
      {
          result = NotInlineAdd(result, i);
      }
      return result;
  }

        static void Main(string[] args)
        {

            var stopwatch = Stopwatch.StartNew();
            TestInlineAdd();
            stopwatch.Stop();
            Console.WriteLine($"Inline Method Time: {stopwatch.ElapsedMilliseconds} ms");

            stopwatch.Restart();
            TestNotInlineAdd();
            stopwatch.Stop();
            Console.WriteLine($"NotInline Method Time: {stopwatch.ElapsedMilliseconds} ms");}



可以看出使用内联的测试方法,CPU使用率相对较低。

posted @ 2024-11-12 23:17  JohnYang819  阅读(4)  评论(0编辑  收藏  举报