为什么处理Value比使用Reference for Struct更快?

它可能不清楚,但是,当我阅读msdn doc并尝试深入理解Struct行为时。

来自msdn

处理堆栈:

这将带来性能提升。

并且:

每当您需要经常使用的类型并且大部分只是一个数据时,结构可能是一个不错的选择。

我不明白因为, 我想当我传递一个方法的参数时,“复制值”过程必须比“复制参考”过程慢?

传递结构的成本与其大小成正比。 如果结构小于引用或与引用相同的大小,则传递其值将与传递引用的成本相同。

如果没有,那你就是对的; 复制结构可能比复制引用更昂贵。 这就是为什么设计指南要求保持结构较小的原因。

(请注意,当您在结构上调用方法时,“this”实际上是作为包含结构值的变量引用传递的;这就是您可以编写可变结构的方法。)

使用结构时可能会有性能提升,但正如您正确指出的那样,也存在潜在的性能损失。 结构很便宜(在内存和时间上)分配和廉价解除分配(及时),如果它们很小则便宜复制。 在内存和分配时间方面,引用稍微昂贵,解除分配成本更高,复制成本更低。 如果你有大量的小结构 – 比如一百万个点结构 – 那么分配和释放一个包含一百万个结构的数组比一百万个引用一百万个点的数组要便宜一些类。

但是如果结构很大,那么所有额外的复制可能比从更有效的分配和释放中获得的好处更昂贵。 在进行性能分析时,您必须全面了解情况; 如果没有经验数据来支持该决定,不要在绩效的基础上做出“结构与类”决策。

在我们自己的文档和许多书中,有很多关于内存管理如何在C#幕后工作的错误信息。 如果你有兴趣了解什么是神话,什么是现实,我建议你阅读我关于这个主题的系列文章。 从底部开始:

http://blogs.msdn.com/b/ericlippert/archive/tags/memory+management/

结构的另一个建议是它们应该很小; 不大于16个字节。 这样,它们可以通过一条指令或一些指令进行复制。

复制相当少量的数据几乎与复制引用一样快,然后由于不需要重定向,该方法访问数据的速度会更快。

如果struct小于指针(即32位或64位),复制值甚至比复制引用更快。

即使结构比引用大一点,创建对象仍然存在一些开销。 每个对象都有一些开销,必须分配为一个单独的内存块。 作为值类型的字节只占用一个字节,但如果将该字节作为对象打包,则它将占用堆上的16或24个字节,再加上另外4或8个字节作为参考。


无论如何,使用结构或类的决定通常应该是它们所代表的数据类型,而不仅仅是性能。 结构适用于表示单个实体的数据,因此您可以将其视为单个值。

关于复制过程的内容是正确的,因为复制引用所花费的时间比复制结构要少,因为所有结构和引用都存储在堆栈中。 但是msdn建议使用struct会给性能提升的原因是访问堆栈和堆所需的时间。

如果你需要一个主要包含静态数据的类型并且不是很大(意味着它不包含巨大的数组,多维或其他类型的值),那么使用struct而不是引用类型作为栈的访问会更明智远低于托管堆。

除此之外,分配和释放所花费的时间,或者简而言之,与堆栈相比,堆的管理有点耗时。

您可以在此处和此处更好地理解此主题,因为已对此进行了详细说明。

希望能帮助到你。