Jon*_*rop 14 c# f# garbage-collection multicore
我最近对.NET 4垃圾收集器进行了基准测试,从多个线程中集中分配.当分配的值记录在一个数组中时,我没有像我预期的那样观察到没有可伸缩性(因为系统争用对共享旧代的同步访问).但是,当分配的值立即被丢弃时,我惊恐地发现没有可扩展性!
我曾预计临时案例几乎是线性扩展的,因为每个线程应该简单地擦除托儿所gen0干净并重新开始而不争用任何共享资源(没有任何东西幸存到老一代并且没有L2缓存未命中因为gen0很容易适合L1缓存).
例如,这篇MSDN文章说:
无同步分配在多处理器系统上,托管堆的第0代将被分成多个内存竞技场,每个线程使用一个竞技场.这允许多个线程同时进行分配,因此不需要对堆进行独占访问.
任何人都可以验证我的发现和/或解释我的预测和观察之间的这种差异吗?
Han*_*ant 12
不太确定这是什么以及你在机器上看到的确切内容.但是,您的计算机上有两个不同版本的CLR.Mscorwks.dll和mscorsvc.dll.前者是您在工作站上运行程序时获得的程序,后者是Windows的某个服务器版本(如Windows 2003或2008).
工作站版本对您的本地PC很友好,它不会吞噬所有机器资源.在GC正在进行时,您仍然可以阅读您的电子邮件.服务器版本经过优化,可在服务器级硬件上进行扩展.大量的RAM(GC不会那么快)和大量的CPU核心(垃圾收集在多个核心上).您引用的文章可能会谈到服务器版本.
您可以在工作站上选择服务器版本,使用<gcServer>.config文件中的元素.