gpt4 book ai didi

.net - 随着应用程序运行时间的延长,.NET 单例的性能是否会降低?

转载 作者:行者123 更新时间:2023-12-04 15:34:39 25 4
gpt4 key购买 nike

我一直在阅读有关 .NET 中的垃圾收集和内存管理的信息。我想问以下问题以检查我的理解:

假设我有一个在应用程序开始时创建的单例,并且在 GC 的第 0 代中。然后想象我有另一个类引用这个单例并且在内存中也接近它(因为它也在第 0 代中)。推断它们可能在同一缓存行中是否合理?

当应用程序运行时,GC 将对象提升到第 1 代,并最终进入第 2 代。创建的任何新对象现在都可能远离内存中的单例。我是否正确假设新对象和单例之间的访问可能会更慢,因为它们不能在同一个缓存行中?

GC 是否尝试将经常相互访问的对象在内存中保持得更近?

我不打算尝试优化代码或第二次猜测垃圾收集器,我意识到这是一个人为的例子。我只是对 GC 如何使用内存以及 CPU 缓存如何工作背后的理论感兴趣。

最佳答案

Is it reasonable to infer that they could be in the same cache line?



这是可能的,但这是不太可能的,除非两个对象碰巧都非常小并且彼此紧随其后分配。但是,我不会假设它们会位于同一缓存行上,因为这不是您在实践中可以控制或强制执行的。

As the application runs, the GC promotes the object through to generation 1, and eventually generation 2. Any new objects created could now be quite far away from the singleton in memory. Am I right in assuming access between the new objects and the singleton could potentially be slower as they cannot be in the same cache line?



没有区别,除非这两个对象刚开始刚好在同一个缓存行上。一旦它们位于不同的缓存行上,它们之间的“距离”就不再重要了。

Does the GC make any attempt to keep objects that access each other frequently closer together in memory?



不会。对象不会在运行时根据其访问模式进行重组和移动。只有在由于先前的收集而有可用空间时发生的压缩才会移动对象。

跟踪使用情况和引用模式将非常复杂,并且可能会降低整体性能。

关于.net - 随着应用程序运行时间的延长,.NET 单例的性能是否会降低?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20481313/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com