我打算构建一个在Java中使用多个线程的合并排序算法,我已经浏览了互联网和SO(例如Multi-threading a merge sorting algorithm),但我似乎无法解决我的一些问题。
首先,创建的最佳线程数是否与CPU的内核数相同?在考虑线程数时,我是否应该考虑逻辑核心?
其次,在这种算法中实现多线程的最佳方法是什么?我听说有不止一种方法(比如继承“Thread”类或使用implements Runnable等。)。
此外,在优化方面,使用ArrayLists或LinkedLists是更好的选择吗?
赞赏有关实施的任何其他说明/建议。
干杯。
答案 0 :(得分:3)
在Java 8中,如果您请求Arrays.parallelSort()
的并行性,则流API也会使用parallelStream
。 parallelSort
的来源应该是非常有用的,如果您出于教育目的而对此进行调查。
答案 1 :(得分:1)
...创建的最佳线程数是否与CPU的内核数相同?
我会这么认为。合并排序应该是内存带宽有限,而不是cpu带宽限制。早期多线程的主要好处是利用每个核心的本地缓存,通常是1级和2级缓存。通常,级别3高速缓存在核心之间共享,因此,如果合并过程相对于3级高速缓存的速度相对CPU受限,那么唯一的增益就是。一旦运行规模变得足够大以超过缓存限制,那么我不确定从多线程中获得多少。
Microsoft的stable_sort首先使用插入排序来创建32个元素的已排序组,这可能是为了利用本地缓存。我不确定这对当前的处理器是否真的有帮助,因为它基于1994年编写的代码。