JDK1.7中加入了并行计算API。在这个个人电脑都已经是多核的情况下,可说是应景。
源代码可以从java官方网站上下载,在sample/forkjoin/mergsort 下。
MergeDemo.java
//运行次数,运行多次的话耗时是取的平均值
private static final int ITERATIONS = 1;
//受制与CPU,本机i7双核当值为3时cpu使用率基本已到峰值240%,继续加大这个值无意义
private final Range parallelism;
//第一个rang是定义的计算量;第二个定义的并行数
private final static Configuration defaultConfig = new Configuration(new Range(100000, 100000, 10),
new Range(1, 1, 4));
MergeSort.java
//判断是否要并行的阀值,太小的话可能会变慢
private static final int THRESHOLD = 500;
最后附上以上配置的运行结果,受制于测试环境,并行度大于2的时候,继续加大并行度性能提升不明显。Default configuration. Running with parameters: 100000 100000 10 1 1 4
Time in milliseconds. Y-axis: number of elements. X-axis parallelism used.
1 2 3 4
100000: 12 9 8 8
200000: 26 17 15 13
300000: 44 25 21 19
400000: 51 32 30 26
500000: 62 42 36 32
600000: 80 49 43 40
700000: 94 66 67 57
800000: 115 67 61 50
900000: 122 82 66 64
1000000: 140 84 73 68
Total: 746 473 420 377