Arrays.parallelSort
java8新增的并行排序算法,基于fork/join框架。
Arrays.sort
为串行排序
现在对这两个算法针对不同的数据规模进行性能对比,先上结果后附代码
//先让数据规模按2的指数幂递增
limit:2 parallelSort: 0ms serialSort: 0ms
limit:4 parallelSort: 0ms serialSort: 0ms
limit:8 parallelSort: 0ms serialSort: 0ms
limit:16 parallelSort: 0ms serialSort: 0ms
limit:32 parallelSort: 0ms serialSort: 0ms
limit:64 parallelSort: 0ms serialSort: 0ms
limit:128 parallelSort: 0ms serialSort: 0ms
limit:256 parallelSort: 0ms serialSort: 0ms
limit:512 parallelSort: 0ms serialSort: 0ms
limit:1024 parallelSort: 0ms serialSort: 0ms
limit:2048 parallelSort: 0ms serialSort: 1ms
limit:4096 parallelSort: 0ms serialSort: 1ms
limit:8192 parallelSort: 1ms serialSort: 1ms
limit:16384 parallelSort: 7ms serialSort: 1ms
limit:32768 parallelSort: 8ms serialSort: 4ms
limit:65536 parallelSort: 16ms serialSort: 8ms
limit:131072 parallelSort: 17ms serialSort: 9ms
limit:262144 parallelSort: 5ms serialSort: 20ms//转折点
limit:524288 parallelSort: 10ms serialSort: 42ms
limit:1048576 parallelSort: 20ms serialSort: 92ms
limit:2097152 parallelSort: 41ms serialSort: 241ms
limit:4194304 parallelSort: 98ms serialSort: 484ms
limit:8388608 parallelSort: 178ms serialSort: 783ms
limit:16777216 parallelSort: 371ms serialSort: 1712ms
limit:33554432 parallelSort: 770ms serialSort: 3470ms
limit:67108864 parallelSort: 1772ms serialSort: 8073ms
//然后按10的指数幂递增
limit:10 parallelSort: 0ms serialSort: 0ms
limit:100 parallelSort: 0ms serialSort: 0ms
limit:1000 parallelSort: 0ms serialSort: 1ms
limit:10000 parallelSort: 5ms serialSort: 1ms
limit:100000 parallelSort: 23ms serialSort: 11ms
limit:1000000 parallelSort: 34ms serialSort: 83ms//转折点
limit:10000000 parallelSort: 216ms serialSort: 1048ms
limit:100000000 parallelSort: 2466ms serialSort: 11992ms
从上面的结果,可以看出当数据规模达到262144(即2的18次方)时,并行排序的性能要超过串行排序。
测试代码
public class Test {
public static void main(String[] args){
for(int i=10;i<Integer.MAX_VALUE;i*=10)
test(i);
}
static void test(long limit){
Random rand = new Random();
IntStream stream = rand.ints(limit);
int[] arr = stream.toArray();
int[] arr1 = Arrays.copyOf(arr, arr.length);
long t1 = System.currentTimeMillis();
Arrays.parallelSort(arr);
long t2 = System.currentTimeMillis();
Arrays.sort(arr1);
long t3 = System.currentTimeMillis();
System.out.println("limit:"+limit+"\t parallelSort: "+(t2-t1)+"ms\tserialSort: "+(t3-t2)+"ms");
}
}
测试机参数
CPU:i7-3630QM 8核*2.4G