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



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

"用结构代替对象"(我想你所说的对象是)很可能没有什么帮助,因为由于结构的性质,创建结构实例需要按值而不是按引用来引用它,而这可能会让你的内存使用更重

话虽如此,您可能需要飞线设计图案


发件人https://sourcemaking.com/design_patterns/flyweight:

飞线设计图案

意图

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

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

问题

将对象设计到最低级别的系统"粒度"可以提供最佳的灵活性,但在性能和内存使用方面可能会非常昂贵。

讨论

Flyweight模式描述了如何共享对象,以便在没有高昂成本的情况下以细粒度使用它们。每个"轻量级"对象分为两部分:状态相关(外在)部分和状态无关(内在)部分。内在状态存储(共享)在Flyweight对象中。外部状态由客户端对象存储或计算,并在调用其操作时传递给Flyweight。

以下是关于C#中structclass的一些事实:

  • C#中的structclass创建得更快,因为它是在堆栈上分配的,而不是在堆上
  • struct是一个值类型,class是一个引用类型。因此,使用引用类型(将其作为参数传递、复制…)要比使用值类型快得多。请参阅结构和类之间的区别
  • struct字段比class字段访问速度快,因为它们是在堆栈上分配的

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

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

知道了所有这些,简而言之,如果你不想让你的程序受到GC工作的影响,你必须对程序中使用时间越长的对象使用引用类型,对使用时间很短、范围很本地化的对象使用值类型。