我想实现自己的多线程排序算法,但是当我将其与单线程Array.Sort
进行比较时,我得到64MB随机数组的结果:16秒 - PLINQ,27秒 - 我的实现,70秒 - {{ 1}}。显然PLINQ更快,所以我应该提高我的认识来克服PLINQ的问题。我正在使用数组,我知道它,当PLINQ使用Array.Sort
作为源时,因此它无法对集合大小做任何假设等等(并将此知识转换为性能提升)。
现在我发现PLINQ生成N个分区(N = Environment.ProcessorCount),然后生成多个帮助器和IEnumerable<T>
s(方法Barrier
,see on referencesource),但我不知道了解当时发生的事情。为什么需要这个障碍,实际如何排序,为什么它使用分区......每个分区都可以排序,但不能保证整个数组都是有序的。也许它按照某种顺序合并它们,但是怎么样?我在这个兔子洞里真的很深,但仍然混淆了发生了什么。
实际排序在此处执行:
SortHelper<TInputOutput, TKey>.GenerateSortHelpers
从所有线程调用它,最后我们得到排序输出。