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

C# 对象创建开销是否适用于结构?,c#,performance,object,struct,creation,C#,Performance,Object,Struct,Creation,我要求一个C#语言的项目,但我认为这个问题也适用于其他语言。我听说大规模对象创建和销毁会导致大量开销和性能问题。我想知道我是否可以通过简单地使用结构而不是对象来解决这个问题。“用结构代替对象”——正如你所说的(我想你所说的对象是类),由于结构的性质,创建结构实例可能没有什么帮助,这将要求你通过值而不是通过引用来引用它-这可能(并不总是)使你的记忆使用更重 话虽如此,您可能需要的是Flyweight设计图案 发件人: Flyweight设计图案 意图 使用共享有效地支持大量细粒度对象 Motif

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

“用结构代替对象”——正如你所说的(我想你所说的对象是类),由于结构的性质,创建结构实例可能没有什么帮助,这将要求你通过值而不是通过引用来引用它-这可能(并不总是)使你的记忆使用更重

话虽如此,您可能需要的是Flyweight设计图案


发件人:

Flyweight设计图案

意图

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

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

问题

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

讨论


Flyweight模式描述了如何共享对象,以允许以细粒度使用对象,而无需高昂的成本。每个“flyweight”对象分为两部分:状态相关(外部)部分和状态无关(内部)部分。内在状态存储(共享)在Flyweight对象中。外部状态由客户端对象存储或计算,并在调用Flyweight的操作时传递给Flyweight。

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

  • C#中的
    结构
    创建得更快,因为它是在堆栈上而不是在堆上分配的
  • struct
    是值类型,
    class
    是引用类型。因此,使用引用类型(将其作为参数传递、复制等)比使用值类型快得多。看
  • struct
    字段比
    class
    字段访问速度快,因为它们是在堆栈上分配的
以下是有关GC在.Net中如何工作的一些事实:

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

简而言之,如果你不想让你的程序受到GC工作的影响,你必须对那些在你的程序中存活时间较长的对象使用引用类型,并为将在很短时间内使用且在非常本地化的范围内使用的对象使用值类型。

对象创建确实会产生一些实际成本——您正在登记垃圾收集器;虽然gen 0非常有效,但它仍然不如传递一个简单整数(如果该整数是要传递的数据的总和)那么有效。一般来说,如果数据量非常小(只有几个字节),结构会更好(几乎总是假定它们是不可变的)。如果你想知道一种特定编程技术的成本是多少,那么就使用科学,而不是互联网上陌生人的观点。您知道您有性能问题吗?如果您不知道这一点,那么为什么要尝试使用可能不起作用的技术来解决一个您甚至可能没有的问题?