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

随着应用程序运行时间的延长,.NET单例是否会降低性能?,.net,caching,garbage-collection,cpu,.net,Caching,Garbage Collection,Cpu,我一直在读.NET中的垃圾收集和内存管理。我想请以下人员检查我的理解: 假设我有一个在应用程序开始时创建的单例,它位于GC的第0代。然后想象我有另一个类引用这个单例,并且在内存中也接近它(就像第0代一样)。推断它们可能在同一缓存线中是否合理 当应用程序运行时,GC将对象升级到第1代,最终升级到第2代。现在创建的任何新对象都可能与内存中的单例对象相去甚远。我假设新对象和单例对象之间的访问可能会较慢,因为它们不能在同一缓存线中,这对吗 GC是否试图使经常相互访问的对象在内存中靠得更近 我不想试图优化

我一直在读.NET中的垃圾收集和内存管理。我想请以下人员检查我的理解:

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

当应用程序运行时,GC将对象升级到第1代,最终升级到第2代。现在创建的任何新对象都可能与内存中的单例对象相去甚远。我假设新对象和单例对象之间的访问可能会较慢,因为它们不能在同一缓存线中,这对吗

GC是否试图使经常相互访问的对象在内存中靠得更近

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

推断它们可能在同一缓存线中是否合理

这是可能的,但除非两个对象恰好都很小,并且是紧跟在一起分配的,否则这是不太可能的。但是,我不会假设它们位于同一个缓存线上,因为实际上这不是您可以控制或强制执行的

当应用程序运行时,GC将对象升级到第1代,最终升级到第2代。现在创建的任何新对象都可能与内存中的单例对象相去甚远。我假设新对象和单例对象之间的访问可能会较慢,因为它们不能在同一缓存线中,这对吗

除非两个对象在开始时恰好位于同一个缓存线上,否则不会有任何区别。一旦它们位于不同的缓存线上,它们之间的“距离”就不再重要了

GC是否试图使经常相互访问的对象在内存中靠得更近

不会。对象不会根据其访问模式在运行时重新组织和移动。只有在由于以前的集合而存在可用空间时,才会由于压缩而移动对象


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

这实际上没有什么区别。我认为将活动对象从G0复制到G2可以维持秩序。我希望这是G0的线性传递。从这个意义上说,随着时间的推移,更多的死物体被震出,活物体移动得越近。+1'd因为我被GC的黑色魔法迷住了。但我认为,如果单例作为设计应用程序的最佳选择是有意义的,那么做出这一决定所带来的好处将超过GC对性能的任何影响。任何存活时间超过几秒钟的对象将其所有相关对象放在同一缓存线上的可能性就很低了。