对象创建开销是否适用于结构?

时间:2016-04-21 01:09:07

标签: c# performance object struct creation

我在C#中要求一个项目,但我认为这个问题也适用于其他语言。我听说大量的对象创建和破坏会导致巨大的开销和性能问题。我想知道我是否可以通过简单地使用结构而不是对象来解决这个问题。

2 个答案:

答案 0 :(得分:5)

"使结构而不是对象" - 正如你所说的那样(我猜你的意思是 object class )因为结构的本质而很可能在创建struct实例时没什么帮助,将要求你通过值而不是通过引用来引用它 - 这个可能(并不总是)使你的记忆使用更重

话虽这么说,你可能需要的是 Flyweight设计模式

来自https://sourcemaking.com/design_patterns/flyweight

Flyweight设计模式

意图

使用共享有效地支持大量细粒度对象。

使用轻量级小工具替换重量级小部件的Motif GUI策略。

问题

将对象设计到最低级别的系统"粒度"提供最佳的灵活性,但在性能和内存使用方面可能会令人无法接受。

讨论

Flyweight模式描述了如何共享对象以允许在细粒度下使用它们而不会产生过高的成本。每个" flyweight"对象分为两部分:状态依赖(外在)部分和状态无关(内在)部分。内部状态在Flyweight对象中存储(共享)。外部状态由客户端对象存储或计算,并在调用其操作时传递给Flyweight。

答案 1 :(得分:2)

以下是您现在必须了解的关于C#中structclass的一些事实:

  • C#中的struct创建速度比class快,因为它是在堆栈上分配而不是在堆上
  • struct是值类型,class是引用类型。因此使用引用类型(将其作为参数传递,复制它,...)比使用值类型快得多。见Difference between struct and class
  • struct字段的访问速度快于class字段,因为它们已在堆栈中分配

以下是关于GC如何在.Net中工作的一些事实:

  • 您无法控制CLR何时触发GC,它可以随时中断您的程序(您可以使用一些选项告诉CLR您正在运行代码的敏感部分但如果需要内存,它不会阻止GC运行。请参阅GC Latency Modes
  • 您无法控制GC执行此操作的时间
  • 当GC进行完整收集时,它会冻结所有程序线程(取决于您是处于gcConcurrent还是gcServer模式,请参阅gcServer mode)。

了解所有这些并且简短,如果您不希望您的程序受到GC工作的影响,您必须使用在程序中存活时间较长的对象的引用类型,并使用对象的值类型这将用于非常短的时间和非常局部的范围。