【问题标题】:Can C# recursive methods be inlined?C# 递归方法可以内联吗?
【发布时间】:2017-12-10 08:51:16
【问题描述】:

假设我有一个递归方法,或者一个静态方法。它可以内联以提高性能吗?它可能包含一个单行条件运算符。

【问题讨论】:

  • @SudheeshSinganamalla 不,我对内联方法感兴趣,而不是匿名方法。
  • 真正的问题是“这会提高性能吗”?
  • 你能和我们分享一下有问题的代码吗?
  • 这是一个假设。

标签: c# recursion inline tail-recursion


【解决方案1】:

即使您希望编译器内联您的方法。并非所有方法都可以内联。在这种情况下,递归方法不能是内联方法,因为它需要调用自己。

积极内联
指定应尽可能内联该方法。

内联就是用方法内容代替方法调用,所以不能内联递归方法。

【讨论】:

    【解决方案2】:

    这取决于功能的作用..

    如果是阶乘:(5!)==5*4*3*2*1,你可以这样写:

    private static int Factorial(int v)
            {
                if (v == 1)
                    return v;
                return v * Factorial(v - 1);
            }
    

    或者:

    private static int Factorial2(int v)
        {
            int i = 1;
            int accum = 1;
            while (i++ < v)
                accum *= i;
            return accum;
        }
    

    但是 - 我敢肯定,并非所有功能都可以像那样转移。 至于性能,第一个需要 3 英里,n=80,第二个需要 0 英里......所以是的 - 正如你所假设的那样,这是有优势的。

    编辑: 我现在看到您放置了一个“Tail recrusion”标签,将鼠标悬停在标签上时 - 告诉您答案。是的,编译器知道如何使这些递归成为“内联”。我的时间测试指的是“调试”模式。也应该在发布中进行测试。

    【讨论】:

      猜你喜欢
      • 2012-04-01
      • 2010-09-16
      • 1970-01-01
      • 2015-12-16
      • 1970-01-01
      • 2011-06-12
      • 2021-11-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多