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

时间:2012-03-16 13:48:34

标签: c#

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

来自msdn

处理堆栈:

  

这将带来性能提升。

和:

  

每当你需要一种经常使用的类型时   大多数只是一个数据,结构可能是一个很好的选择。

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

3 个答案:

答案 0 :(得分:18)

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

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

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

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

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

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

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

答案 1 :(得分:4)

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

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

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

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


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

答案 2 :(得分:-1)

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

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

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

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

希望它有所帮助。