这段代码开了并行为什么变慢了?

开了并行需要17秒左右,把.parallel去掉后只用5秒左右(i5双核)

public static void mainString[] args
{ long start = System.currentTimeMillis; long ret = new Random.longs0, 10 .limit10000 * 10000 .parallel .sum; long end = System.currentTimeMillis; System.out.printlnret; System.out.println"takes " + end - start + "ms"; }
}

然后把代码中的stream改成用range而不用random生成随机数流,则是开并行要比不开并行快一倍(300ms:600ms):

public static void mainString[] args
{ long start = System.currentTimeMillis; long ret = IntStream.range0, 1000000000 .parallel .sum; long end = System.currentTimeMillis; System.out.printlnret; System.out.println"takes " + end - start + "ms"; }
}

为什么前一个例子开并行会更慢,是random类的缘故吗?望指教!

开了并行之后需要对原数组进行分块,在每块内执行累加,然后再合并,这些额外操作都是需要时间的。而累加本身就是线性运算非常高效。所以,如果并行的数据不够大,或者参数(比如任务数等)设置不合理,反而不如原来效率高

发表评论

电子邮件地址不会被公开。 必填项已用*标注