makotan _at_ gmail dot com

iteratorや拡張forよりStreamのforEachが速い?

きしださんが書いたコードの一カ所が謎だったので・・・

謎だったコードは

Streamを使ってみる。
static Integer stream(){
int[] c = {0};
array.stream().forEach(i -> c[0] += i);
return c[0];
}
5715msで、かなり速い。

これと

static Integer reduce(){
return array.stream().collect(Collectors.summingInt(i -> i));
}
40280msと、想像以上に遅い。

手元で試してもreduceが遅いのは確かなんだけど・・・
これだとIntとIntegerの型変換のロスが結構あるんじゃ無いかなぁ〜って


外した版を作ってみた
そして計測してみた

forEach(704982704):9741ms
ite(704982704):9559ms
index(704982704):9595ms
stream(704982704):4139ms
intreduce(704982704):4131ms
paraintreduce(704982704):1979ms
reduce(704982704):34121ms
para(704982704):12383ms
reduce2(704982704):27314ms

それでも単純なforEachに比べても3倍弱か・・・何処にそんな余計なコストがかかってるんだろう