继续讨论 了解VS2010 C#并行分析结果 但更多的是:

我有许多并行工作的线程(使用/每个),这些线程使用许多记忆分配用于小类。

这会在全局内存分配线程上创建争论。

是否有一种方法可以指示.NET对每个线程进行预处理一个内存池并进行此池中的所有分配?

目前,我的解决方案是我自己的内存池的实现(T型对象的全球分配阵列,它们在线程之间回收),这对:很有帮助,但由于:

  1. 我无法指示.net从特定的内存切片中分配。
  2. 我仍然需要打电话 新的 很多次分配池的内存。

谢谢,
哈盖

有帮助吗?

解决方案

我搜索了两天,试图找到解决您遇到的相同问题的答案。答案是您需要将垃圾收集模式设置为服务器模式。默认情况下,将垃圾收集模式设置为工作站模式。将垃圾收集设置为服务器模式,导致托管堆分为单独管理的部分,即每次CPU。为此,您需要将配置设置添加到app.config文件中。

<runtime>
   <gcServer enabled="true"/>
</runtime>

我的12核Opteron 6172上的速度差异很大!

其他提示

垃圾收集器不会分配内存。

听起来更像是您要分配许多小临时对象和一些长寿命的对象,而垃圾收集器正在花费大量时间来收集临时对象,因此您的应用程序不必从该应用程序请求更多内存。操作系统。从 .NET框架4高级开发 - 垃圾收集:

只要在托管堆中提供地址空间,运行时就会继续为新对象分配空间。但是,记忆不是无限的。最终,垃圾收集器必须执行收集以释放一些内存。

解决方案: 不要分配很多小临时对象。 页面上 垃圾收集和性能 也可能会有所帮助。

您可以预先分配一堆对象,并将它们组成用于单独线程的组。但是,您可能不会从中获得更好的表现。

垃圾收集器专门设计用于有效处理小型短寿命。如果您将物体放在游泳池中,它们是长寿的,并且将在垃圾收藏中生存,这又意味着它们将被复制到第二代堆中。这种复制将比仅分配新对象更昂贵。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top