【问题标题】:Does passing values by reference improve speed significantly? [duplicate]通过引用传递值是否会显着提高速度? [复制]
【发布时间】:2010-08-17 11:35:11
【问题描述】:

可能的重复:
Pass by value vs Pass by reference performance C#.net

是否有人已经测试过通过引用传递参数是否比复制它们快得多?

但问题的主要焦点是:使用 ref 关键字与不使用它相比有什么缺点吗?

【问题讨论】:

标签: c# oop


【解决方案1】:

不,它不会显着提高速度,或者根本不会。相反,通过使用ref 关键字,您添加了另一层间接性,这只会使代码变慢。

参数通常是按值传递的,这意味着它们是被复制的。对于像int 这样的简单值,它只是意味着将值的副本放在堆栈上。

对于像string 这样的引用类型,这意味着引用的副本放在堆栈上。因此,这并不意味着复制了整个对象,而只是复制了对对象的引用。

您通常不应使用 refout 关键字,除非有特殊原因。

【讨论】:

  • 一个小问题:如果你有一个 large 结构,那么通过 ref 传递它可能会略微提高性能。话虽如此,如果您的结构太大以至于通过 val 传递它会显着影响性能,那么您应该认真考虑重构类型本身,而不是通过 ref 传递它。
  • 我不明白,如果使用string参数时只传递引用,那么在更改传递时如何不改变原始变量?内存中必须有一个新的字符串副本(或者我错了吗?)。如果我正在处理(或解析,但不改变)非常大的字符串,通过ref 传递它会不会更快?谢谢你的解释:)。
  • @Buksy:通过值传递的引用类型(如字符串)的参数意味着传递了引用的副本。如果更改参数,它不会影响原始参考。这里的另一个因素是字符串是不可变的,因此您永远无法更改原始字符串。如果您通过引用发送字符串参数,您可以更改原始引用,使其指向不同的字符串对象。由于字符串是不可变的,因此不需要复制它们以确保方法无法更改它们,这使得按值传递字符串的效率更高。
【解决方案2】:

C#中有值类型和引用类型

在引用类型的情况下,不带ref 关键字传递它们意味着传递引用。我没有测试它,但我希望编译器和 .NET 框架的实现者尽可能快地传递它们。我无法想象传递对这些引用的引用比传递引用要快。这没有意义。

对于值类型,情况就另当别论了。如果一个结构很大,复制它肯定会很昂贵,并且传递引用应该更快。但是值类型是值类型是有原因的。如果你有一个值类型并且你担心将它传递给函数的效率,很可能你把它当作一个值类型是错误的。

【讨论】:

    猜你喜欢
    • 2021-05-20
    • 2010-10-10
    • 2012-07-08
    • 2014-06-23
    • 2016-06-11
    • 1970-01-01
    相关资源
    最近更新 更多