【问题标题】:Stack and Heap performance?堆栈和堆性能?
【发布时间】:2020-04-20 06:15:54
【问题描述】:

我使用 C# 使用 struct 和 class 运行了一个小型测试...使用 WriteLine 在每个(控制台应用程序)上执行了一个简单的方法,并使用 System.Diagnostics.StopWatch 进行测量。

我的期望是 struct 会更快,但结果表明它们在性能上几乎相同。

由于堆具有更多的处理开销,因此对堆栈与堆的重视程度一直很高……我一直对我的代码保持警惕,认为堆栈是我想要的设计构造。

那么在虚拟执行系统(又名 CLR)中是否发生了其他一些事情,它正在做一些使堆栈和堆变得琐碎的优化?

我必须承认,我以前从未真正考虑过对此进行测试,也许我只是需要更复杂的测试才能真正看到差异?

想法?

干杯,罗伯。

【问题讨论】:

  • 谈到性能时,上下文很重要。在没有看到您的代码的情况下,我们不可能告诉您为什么您没有得到预期的结果。您关于“堆具有更多处理开销”的说法是正确的,但只是在一定程度上。花费的不是访问堆上的项目,而是分配(并且在某种程度上,取消分配)内存。如果您想要一个合理的答案,您必须向我们展示您的代码。

标签: performance stack heap-memory


【解决方案1】:

过早的优化。

您不会根据速度选择堆/堆栈。您可以根据需要多少内存来选择它。唯一的额外开销是分配/取消分配堆内存的时间,但在总体方案中这是微不足道的。

你已经花在这上面的时间比它需要的多:-)

【讨论】:

  • 不得不不同意你的观点,无论内存消耗如何,堆栈都应该更快。也许这是 CLR 的事情,结果与非托管 C++ 不同?还是 CPU 缓存?
  • 您认为内存有两种物理类型,一种比另一种更快? “堆栈”是相同的内存,只是“系统”允许您将其中的一部分作为堆栈。也许这是一个更好的答案? stackoverflow.com/questions/24057331/…
  • @RobAinscough “无论内存消耗如何,堆栈都应该快得多。”一点也不真实。是什么让您认为应该如此?
  • 不,实际上是的,有几个级别的物理内存以不同的速度运行,L1 高速缓存、L2 高速缓存、L3 高速缓存、RAM、VRAM 等等……但为了清楚起见我说的是“访问”……这篇文章建议堆栈更快,因为分配是在编译时完成的,而堆是在运行时分配的:net-informations.com/faq/net/stack-heap.htm“有点慢”……我假设是因为堆栈LIFO 是哪里 - 因为堆分配需要更多的工作来分配和跟踪......也许问题归结为随着时间的推移内存碎片?
猜你喜欢
  • 2014-06-23
  • 2016-12-14
  • 1970-01-01
  • 2022-06-10
  • 2016-04-20
  • 1970-01-01
  • 2021-12-08
  • 2023-03-20
  • 2014-03-27
相关资源
最近更新 更多