cdi*_*ins 12 .net parallel-processing concurrency performance garbage-collection
我使用任务并行库从.NET框架4(特别是Parallel.For和Parallel.ForEach)并行有些任务看起来像他们应该在双核机器上容易实现并行然而,当我得到极其平庸速度起坐.
在分析系统时,由于垃圾收集器,看起来有很多线程同步正在进行.我正在进行大量的对象分配,所以我想知道如何在最小化代码重写的同时提高并发性.
例如,在这种情况下是否有一些技术可用:
Dispose吗?后记:
问题不在于GC运行得太频繁,而是GC阻止并发代码有效并行运行.我也不认为"分配更少的对象"是可接受的答案.这需要重写太多代码来解决一个很难并行化的垃圾收集器.
我已经发现了一个有助于整体性能的技巧(使用gcServer),但它并没有帮助并发性能.换句话说Parallel.For,在一个令人尴尬的并行任务上,它比串行For循环快20%.
后后记:
好的,让我进一步解释一下,我有一个相当大而复杂的程序:一个优化的解释器.它足够快,但我希望它在给定并行任务(我的语言中内置的基本操作)时的性能,以便在更多内核可用时进行扩展.我在评估期间分配了大量小对象.整个解释器设计基于从单个多态基础对象派生的所有值.这在单线程应用程序中运行良好,但是当我们尝试将任务并行库应用于并行评估时,没有任何优势.
经过大量调查,为什么任务并行库没有为这些任务在核心之间正确地分配工作,似乎罪魁祸首是GC.显然GC似乎是一个瓶颈,因为它做了一些我不理解的场景线程同步.
我需要知道的是:究竟是GC这样做可能会导致严重的并发代码来执行不好当它大量拨款,以及我们如何解决这除了刚刚分配较少的对象.我已经想到了这种方法,并且需要对大量代码进行重大改写.
如果GC由于分配的太多对象/ GC编辑过于频繁,请尝试分配更少的对象:)
根据您的情况 - 尝试重用现有对象,创建对象池,使用"较轻"的对象,这些对象不会产生太大的内存压力(或者更大以减少分配的对象数).
不要试图通过明确地调用GC.Collect来"管理GC",它很少得到回报(Rico Mariani这样说)
或http://blogs.msdn.com/ricom/archive/2003/12/02/40780.aspx