【问题标题】:C# is there a difference between passing a struct reference and a class reference to a method in terms of speed?C# 在速度方面将结构引用和类引用传递给方法有区别吗?
【发布时间】:2018-01-27 00:10:13
【问题描述】:

正如here 所见,结构通过副本传递,类通过引用传递。但是为什么使用 ref 关键字通过引用传递结构仍然比传递对类的引用要慢?

通过将struct 关键字替换为class,我的程序获得了不同的速度。所有变量都已通过 ref 关键字传递。
通过更改关键字,我的测试速度提高了 20%。既然我已经通过参考,速度不应该保持不变吗?我不明白什么?

【问题讨论】:

  • 如果你能做一个最小的例子来展示你的观察结果会有所帮助,并在此处发布代码
  • 使用ref 关键字传递结构对象与传递类对象不同。例如,在被调用的方法中,如果将不同的对象分配给 ref'd 参数,则调用者中的变量也指向新对象。但是如果你只是将一个类对象传递给方法,将一个新对象分配给参数不会影响调用者中的变量。查看这两种方法生成的 IL 可能对您有所帮助。
  • 你读过Choosing Between Class and Struct吗?您的对象是否满足项目符号列表中提到的所有特征?我猜它不会——这可能就是你发现课程表现更好的原因。
  • 感谢您的提示,我认为我仍然缺乏对 C# 工作原理的基本了解

标签: c# class struct pass-by-reference


【解决方案1】:

通过ref传递结构与通过值传递类(指向数据的指针)大致相同,通过ref(指向数据的指针)传递类应该比通过值传递类作为额外的解引用要慢一点必填。

将“按值传递结构”替换为“按引用传递结构”是否会提高速度取决于结构的大小。如果您遵循Microsoft's guidance "size of struct

潜在的收益/损失还取决于 32 位与 64 位 (x86/x64) CPU 架构的选择 - 如果性能对您的情况如此重要,请在目标计算机上仔细衡量。

注意:通过 ref 传递结构通常会将类型选择限制为数组和字段 - 确保您愿意接受这样的限制。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-12
    • 1970-01-01
    • 2012-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-11
    相关资源
    最近更新 更多