【问题标题】:Performance consideration when using an out parameter and return value? [duplicate]使用 out 参数和返回值时的性能考虑? [复制]
【发布时间】:2014-02-07 16:00:09
【问题描述】:

在 c# 中从函数的返回值和输出参数获取结果时,性能有何不同?

【问题讨论】:

  • 没有可测量的性能差异。投票结束。
  • out 参数作为对象的引用。当您传递值时,您必须将 out 放在值之前。并 return 从函数返回值。dotnetperls.com/out 这将帮助您理解 out 并在提出问题之前进行搜索。
  • @Simon:还有其他关闭的原因,但是存在性能差异......如果你看起来真的真的很努力并且眯着眼睛。

标签: c# .net


【解决方案1】:

基本上,如果该方法没有其他要返回的内容,则您希望使用return,如果您希望通过单个方法返回其他内容,则可以使用out。性能方面没有区别。

Which is better, return value or out parameter?

【讨论】:

    【解决方案2】:

    out 关键字导致参数通过引用传递。这类似于 ref 关键字,只是 ref 要求在传递变量之前对其进行初始化。要使用 out 参数,方法定义和调用方法都必须显式使用 out 关键字。例如:

    class OutExample
    {
        static void Method(out int i)
        {
            i = 44;
        }
        static void Main()
        {
            int value;
            Method(out value);
            // value is now 44
        }
    }
    

    Reference of out

    Reference 2

    返回 return 语句终止它出现的方法的执行,并将控制权返回给调用方法。它还可以返回一个可选值。如果方法是void类型,return语句可以省略。

    如果 return 语句在 try 块内,则 finally 块(如果存在)将在控制返回调用方法之前执行。

    class ReturnTest
        {
            static double CalculateArea(int r)
            {
                double area = r * r * Math.PI;
                return area;
            }
    
            static void Main()
            {
                int radius = 5;
                double result = CalculateArea(radius);
                Console.WriteLine("The area is {0:0.00}", result);
    
                // Keep the console open in debug mode.
                Console.WriteLine("Press any key to exit.");
                Console.ReadKey();
            }
        }
        // Output: The area is 78.54
    

    Return Reference

    【讨论】:

      【解决方案3】:

      回报是表现不佳 返回在父作用域的(方法)堆栈中构造一个新变量,并将该值/引用复制到它。

      out 是更快的性能 out 向您的函数传递对父范围内变量的引用。所以改变变量会立即改变父母的结果

      out vs ref: “out”和“ref”关键字之间没有性能差异,只是编译时安全检查。

      编辑:这里解释了它的重要性:如果您每秒调用一个方法数十亿次:What is the benefit of using out/ref versus returning? 否则,只需简化您的代码理解。

      【讨论】:

      • PS:过早的优化是万恶之源!不要做魔鬼的工作。
      • 关于returnout 慢的任何来源?
      • 如果您可以访问 XNA dll,请查看 Vector 和 Matrix 覆盖方法。你会看到他们喜欢通过 ref 传递东西。正是因为这个原因。抱歉,我目前没有链接。 (多年来有一些关于此的博客文章)
      • 我发现了一个 SO question re xna,所以我在我的答案中链接了它
      【解决方案4】:

      正如我在 cmets 中提到的,out 参数性能由 @JonSkeet 描述 here。这是乔恩回答的摘录:

      “基本上通过使用 out 参数,我们将数据直接写入最终目的地,而不是将其写入小方法的堆栈帧,然后将其复制回 Main 方法的堆栈帧。”强>

      所以性能方面,如果您使用的是小值类型,那么returnout 之间没有任何显着的性能差异。

      【讨论】:

      • ...它是一个小值类型没有区别。一个巨大的引用类型将引用复制到框架..这非常快。
      猜你喜欢
      • 2019-06-25
      • 2011-01-14
      • 1970-01-01
      • 2021-11-19
      • 2013-06-28
      • 1970-01-01
      • 1970-01-01
      • 2011-05-01
      相关资源
      最近更新 更多