自动映射性能在多线程环境中显着降低

时间:2016-03-05 03:15:55

标签: .net multithreading performance

我们使用Automapper工具在多线程环境中映射复杂对象。 我决定使用8核CPU测量在我的机器上运行此代码的Automapper性能:     private const int NumberOfThreads = 8;     Parallel.For(0,50000,               新的ParallelOptions {MaxDegreeOfParallelism = NumberOfThreads},               RunMapping); 此代码正常工作,直到我将线程数增加到16和更高。如果我将它设置为16个线程(私有const int NumberOfThreads = 16;)性能开始降级,从0.3秒(每个映射的平均时间)逐渐缓慢地减少到映射所有50000个相同复杂度的对象的结束时的0.5。如果我把它设置为32个线程甚至更糟:最后从0.4到2.8(7次!)。但是,在8线程环境下完全没有问题:可能会运行几个小时并且执行时间稳定,需要做多次尝试才能确定。我试图声明瞬态和单例映射服务:没有区别。除此之外,我没有注意到任何线程上有任何内存泄漏。 我想知道在Automapper设计中可能出现什么问题,因为线程数超过CPU核心数而变得越来越慢(我认为它可能是相关的)。欢迎任何猜测。 更新:Visual Studio Profiler显示数百个线程,如果我选择收集的大范围数据,当你走下层次结构时,你会看到[外部代码]占用了0.02%的cpu时间,只有很多这样的线程,它们共同需要93个cpu的百分比。所以我不知道VS Profiler如何帮助我发现问题 顺便说一句,如果我将运行的线程保持在保持状态,它会将性能恢复到初始状态,但它会在相同数量的线程下再次开始降级

2 个答案:

答案 0 :(得分:1)

使用8个内核,您可以同时在硬件上运行8个线程。可能是16 hyper threading

超过该数字的任何内容都要求您的CPU使用任何类型的scheduling来使其看起来像并行运行。这将花费更多时间。

答案 1 :(得分:0)

如果我理解正确,你所做的工作是受CPU限制的。现在,如果您将作业拆分为较小的部分,则会增加每个拆分的开销。但是,如果这允许您并行执行这些部分,则总时间会减少。现在,如果你将它分成多个部分而不是你可以并行执行(这是CPU的数量),你只需要增加开销!更糟糕的是,您将上下文切换(包括缓存失效)添加到开销中,因此所需的时间可能会降低。