java fork/join效率问题
最近在研究java的fork/join模式。实现1到 2000000000的累加!贴上代码:
测试类:
public static void main(String[] args) throws InterruptedException, ExecutionException {
Long i = 1l;
Long j = 2000000000l;
Long sum = 0l;
Long startTime = System.currentTimeMillis();
for (; i <= j; i++) {
sum = sum + i;
}
Long endTime = System.currentTimeMillis();
System.out.println("sum : " + sum);
System.out.println("exec time : " + (endTime - startTime));
System.out.println("-----------------------------");
Long _startTime = System.currentTimeMillis();
ForkJoinPool forkJoinPool = new ForkJoinPool();
Future<Long> future = forkJoinPool.submit(new MyTask(1l, 2000000000l, 1000000000l));
System.out.println("sum : " + future.get());
Long _endTime = System.currentTimeMillis();
System.out.println("exec time : " + (_endTime - _startTime));
}
MyTask类:
public class MyTask extends RecursiveTask<Long> {
private static final long serialVersionUID = 4314829800606306387L;
Long start;
Long end;
Long max;
public MyTask(Long start, Long end, Long max) {
this.start = start;
this.end = end;
this.max = max;
}
@Override
protected Long compute() {
boolean flag = (end - start) <= max;
Long sum = 0l;
if (flag) {
for (; start <= end; start++) {
sum = sum + start;
}
} else {
Long middle = (start + end) / 2;
MyTask startTask = new MyTask(start, middle, max);
MyTask endTask = new MyTask(middle + 1, end, max);
startTask.fork();
endTask.fork();
sum = startTask.join() + endTask.join();
}
return sum;
}
}
执行结果:
sum : 2000000001000000000
exec time : 20008
-----------------------------
sum : 2000000001000000000
exec time : 27178
为什么用fork/join模式反而更慢?