【发布时间】:2020-08-24 17:43:32
【问题描述】:
这是一个关于 C# .NET 的非常普遍的问题。一些关于性能优化的技术总是尽可能在堆栈而不是堆上分配对象;使用stackalloc 而不是普通的Array,或者使用结构类型作为局部变量而不是类。我的问题是为什么在堆栈上分配对象会提高性能?在我看来,内存就是内存,所以分配对象的平均时间是一样的。是不是因为避免了垃圾回收?
【问题讨论】:
-
谢谢,我看了那篇文章,说在栈上分配对象比在堆上快,但是为什么在栈上分配比在堆上快呢?
-
我认为这只是因为垃圾收集器。它对它的要求会更少,就像堆一样,您还需要释放数组
-
堆栈分配只涉及增加一个堆栈指针,堆分配需要找到空闲空间,它们的名字实际上是什么意思,分配给堆栈是否更容易,然后在堆中找到一个空闲点.. . 还有 GC 考虑,GC 认为堆栈上的所有内容都在运行(直到它不是),它的管理很简单,开销也少得多.. 总而言之,除非您有特定的设计目标或问题,否则我会将您的编程精力集中在其他事情上
-
“记忆只是记忆”是一个破碎的心智模型。 CPU 寄存器、L1、L2、L3 高速缓存和主存储 (RAM) 具有截然不同的访问时间。分配堆栈空间非常便宜,因为不需要锁(总是线程安全的)并且通常在 L1 缓存中很容易获得。您不能在堆栈中分配对象,它只能存储值。 C# 中存在值类型以增加获得最快可用内存、CPU 寄存器的几率。
标签: c# .net visual-studio .net-core