安易にparallelStreamを使って失敗した話
最近、今更ながらJava8を触っているのですが、
parallelStreamを使うと並列処理ができると聞きまして、
「それならstreamでやったところをparallelStreamに置き換えたら速くなるんじゃん?」
とか安易に考えまして、こんなコードを書いてみました。
import java.util.List; import java.util.stream.Collectors; import java.util.stream.IntStream; public class Calculate { public void run(){ List<Integer> list = IntStream.range(1, 1000000).boxed().collect(Collectors.toList()); list.stream() .map(x -> x * x) .collect(Collectors.toList()); } }
// parallelStreamの場合 import java.util.ArrayList; import java.util.Date; import java.util.List; public class ParallelTest { public static void main(String args[]){ List<Calculate> list = new ArrayList<Calculate>(); list.add(new Calculate()); list.add(new Calculate()); list.add(new Calculate()); list.add(new Calculate()); list.add(new Calculate()); Date in = new Date(); list.stream() .forEach(x -> x.run()); Date out = new Date(); System.out.println(out.getTime() - in.getTime()); } }
// streamの場合 import java.util.ArrayList; import java.util.Date; import java.util.List; public class StreamTest { public static void main(String args[]){ List<Calculate> list = new ArrayList<Calculate>(); list.add(new Calculate()); list.add(new Calculate()); list.add(new Calculate()); list.add(new Calculate()); list.add(new Calculate()); Date in = new Date(); list.stream() .forEach(x -> x.run()); Date out = new Date(); System.out.println(out.getTime() - in.getTime()); } }
1から100000までの値をただただ二乗するメソッドをもつクラスをつくり、
parallelStreamとstreamでそれぞれ実行してみたのですが、
streamでのテストが平均300msほどであったのに対し、parallelStreamは平均3000msほどかかりました。
正直、parallelStreamは並列処理になるので速いはず!
くらいの考えで書いたので、うまくいかないのもしょうがないかなあという気もするんですが、
ネクストアクションはどうしようかな……
「並列処理 Java」とか「parallelStream」で検索してみるかな、とりあえず。