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

对我来说可能并不清楚,但是当我阅读msdn文档并尝试深入理解Struct的行为时。

从msdn

处理堆栈:

这将会提高性能。

和:

无论何时你需要一种经常使用的类型,并且大多只是一个数据,结构可能是一个不错的选择。

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


传递结构的成本与其大小成正比。 如果结构小于参考或与参考大小相同,则传递参数的成本与传递参考的成本相同。

如果不是,那么你是正确的; 复制结构可能比复制参考代价更昂贵。 这就是为什么设计准则要求保持一个很小的结构。

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

使用结构时可能会有性能提升,但正如您正确指出的那样,也有潜在的性能损失。 结构是便宜的(在内存和时间上)分配和便宜以释放(及时),并且如果它们很小则便宜地复制。 在分配内存和时间方面,参考资源的成本稍高一些,分配成本更高,复制成本更低。 如果你有大量的小结构 - 比方说,有100万个结构体 - 那么分配和释放一个有100万个结构体的数组比拥有一百万个对一百万个点实例引用的数组要便宜得多类。

但是如果结构很大,那么所有额外的拷贝可能比从更高效的分配和释放中获得的好处更昂贵。 进行绩效分析时,你必须查看整个情况; 不要根据没有经验数据的性能来做出“结构与类别”决策来支持该决定。

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

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


对结构的另一个建议是它们应该很小; 不大于16个字节。 这样它们可以用一条指令复制,或者只需几条指令。

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

如果结构小于指针(即32位或64位),则复制值的速度甚至比复制参考速度快。

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


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


关于复制过程的描述是真实的,因为复制参考文件比复制结构体的时间要少,因为所有结构体和参考文件都存储在堆栈中。 但是,为什么msdn建议使用struct会让性能增益是访问堆栈和堆所花费的时间。

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

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

你可以在这里和这里更好地理解这个话题,因为这已经详细解释了。

希望能帮助到你。

链接地址: http://www.djcxy.com/p/13887.html

上一篇: Why dealing with Value is faster than with Reference for Struct?

下一篇: Is accessing statically or dynamically allocated memory faster?