对象创建开销是否适用于结构
本文关键字:适用于 结构 是否 开销 创建 对象 | 更新日期: 2024-10-22 17:12:45
我想要一个C#项目,但我认为这个问题也适用于其他语言。我听说大规模的对象创建和破坏会导致大量的开销和性能问题。我想知道我是否可以通过简单地使用structs而不是对象来绕过这个问题。
"用结构代替对象"(我想你所说的对象是类)很可能没有什么帮助,因为由于结构的性质,创建结构实例需要按值而不是按引用来引用它,而这可能会让你的内存使用更重
话虽如此,您可能需要飞线设计图案
发件人https://sourcemaking.com/design_patterns/flyweight:
飞线设计图案
意图
使用共享可以有效地支持大量细粒度对象。
Motif GUI策略,用轻量级的小部件替换重量级的小部件。
问题
将对象设计到最低级别的系统"粒度"可以提供最佳的灵活性,但在性能和内存使用方面可能会非常昂贵。
讨论
Flyweight模式描述了如何共享对象,以便在没有高昂成本的情况下以细粒度使用它们。每个"轻量级"对象分为两部分:状态相关(外在)部分和状态无关(内在)部分。内在状态存储(共享)在Flyweight对象中。外部状态由客户端对象存储或计算,并在调用其操作时传递给Flyweight。
以下是关于C#中struct
和class
的一些事实:
- C#中的
struct
比class
创建得更快,因为它是在堆栈上分配的,而不是在堆上 struct
是一个值类型,class
是一个引用类型。因此,使用引用类型(将其作为参数传递、复制…)要比使用值类型快得多。请参阅结构和类之间的区别struct
字段比class
字段访问速度快,因为它们是在堆栈上分配的
以下是GC如何在.Net中工作的一些事实:
- 你不能控制CLR何时触发GC,它可以随时中断你的程序(有一些选项可以用来告诉CLR你正在运行代码的敏感部分,但如果需要内存,它不会阻止GC运行。请参阅GC延迟模式)
- 你无法控制GC完成工作所需的时间
- 当GC进行完整收集时,它会冻结所有程序线程(取决于您是处于gcConcurrent模式还是gcServer模式,请参阅gcServer模式)
知道了所有这些,简而言之,如果你不想让你的程序受到GC工作的影响,你必须对程序中使用时间越长的对象使用引用类型,对使用时间很短、范围很本地化的对象使用值类型。