gpt4 book ai didi

c# - 使用 ref 而不是返回相同类型的性能成本?

转载 作者:可可西里 更新时间:2023-11-01 08:19:47 25 4
gpt4 key购买 nike

嗨,这件事真的很困扰我,我希望有人能为我解答。我一直在阅读有关 ref(和 out)的文章,我想知道我是否正在使用 ref 减慢我的代码速度秒。通常我会替换如下内容:

int AddToInt(int original, int add){ return original+add; }

void AddToInt(ref int original, int add){ original+=add; } // 1st parameter gets the result

因为在我看来这

AddToInt(ref _value, _add);

比这个更容易阅读和编码

_value = AddToInt(_value, _add);

我确切地知道我在使用 ref 对代码做了什么,而不是返回一个值。然而,性能是我非常重视的事情,显然,当您使用 refs 时,取消引用和清理会慢很多。

我想知道的是为什么我读到的每篇文章都说很少有地方你通常会传递ref(我知道这些例子是人为的,但我希望你明白了),而在我看来,ref 示例更小、更清晰、更准确。

我也很想知道为什么 ref 真的比返回一个值类型慢 - 对我来说,如果我要在返回之前编辑函数值很多,与在从内存中清除之前不久引用该变量的实例相比,引用实际变量来编辑它会更快。

最佳答案

在同一个句子中使用“ref”作为性能的主要时间是在讨论一些非常不典型的情况时,例如在 XNA 场景中,游戏“对象”通常由结构而不是类来表示,以避免出现问题GC(对 XNA 有不成比例的影响)。这对以下方面很有用:

  • 防止在堆栈上多次复制过大的结构
  • 防止由于改变结构副本而导致数据丢失(XNA 结构通常是可变的,这与正常做法不同)
  • 允许直接传递数组中的结构,而不是将其复制出来再复制回来

在所有其他情况下,“ref”通常与额外的副作用相关联,不易在返回值中表达(例如,请参阅 Monitor.TryEnter)。

如果您没有像 XNA/struct 那样的场景,并且没有尴尬的副作用,那么只需使用返回值。除了更典型(本身具有值(value))之外,它还可能涉及传递更少的数据(例如 int 比 x64 上的 ref 更小),并且可能需要更少的取消引用。

最后,返回方法更加通用;您并不总是想更新源代码。对比度:

// want to accumulate, no ref
x = Add(x, 5);

// want to accumulate, ref
Add(ref x, 5);

// no accumulate, no ref
y = Add(x, 5);

// no accumulate, ref
y = x;
Add(ref y, x);

我认为最后一个是最不明确的(紧随其后的是另一个“ref”),并且在不明确的语言(例如 VB)中,ref 用法甚至不太清楚

关于c# - 使用 ref 而不是返回相同类型的性能成本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8110981/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com