Androidのアプリ開発をする際にJava8のStreamAPIを使いたいと考えることがあると思います。
2016/11/12時点では次の2つのライブラリでSteramAPIを使うことを可能とします。
- Lightweight-Stream-API
- RxJava
StreamAPIを外部のライブラリで実現した際に遅いということが話題になることがあるのでできるだけ早いライブラリを利用したほうが良いと思います。
そこで計測してみました。
計測条件
計測条件は次の条件で計測しました。
- 環境:Nexus5XのAPIレベル24のエミュレータ
- データ:ランダムな値を100000個のデータ
- 比較方法:100回の計算時間の平均を比較
- 計測内容1:データをmapを使ってインクリメントした時の計算時間を計測
- 計測内容2:データをsortした時の計算時間を計測
上記の条件をLightweight-Stream-APIとRxJavaを同じ値を利用して実施しました。
結果と結論
結果としてはRxJavaのほうが若干早い結果となりました。
結果は下記になります。
| ライブラリ | 計測内容1 | 計測内容2 |
|---|---|---|
| Lightweight-Stream-API | 17.95ms | 124.24ms |
| RxJava | 17.03ms | 103.82ms |
これはあくまでmapとsortした時の結果で単純な整数型の計算を行っただけの状態になるため複雑な計算を行った際などは変化する可能性があります。
しかし、単純な繰り返しなどの実施では全体的にRxJavaのほうが早い印象を持ちますのでStreamAPIとしてはRxJavaを使ってみるのが良いかもしれません。
検証コード
計測したときのコードは次のようなコードで行いました。
ArrayList<Integer> list = new ArrayList<>();
Random rnd = new Random();
for (int i = 0 ; i < 100000; i++) {
list.add(rnd.nextInt());
}
long sum_lightweight = 0;
long sum_rx = 0;
for (int i = 0; i < 100; i++) {
long start_lightweight = System.currentTimeMillis();
List<Integer> lightweight = Stream
.of(list)
// .sorted()
.map(d -> ++d)
.collect(Collectors.toList());
long end_lightweight = System.currentTimeMillis();
long start_rx = System.currentTimeMillis();
List<Integer> rx = Observable
.from(list)
// .sorted()
.map(d -> ++d)
.toList()
.toBlocking()
.single();
long end_rx = System.currentTimeMillis();
Log.d("techium", "lightweight : " + (end_lightweight - start_lightweight) + ", rx : " + (end_rx - start_rx));
sum_lightweight += (end_lightweight - start_lightweight);
sum_rx += (end_rx - start_rx);
}
Log.d("techium", "sum lightweight : " + (sum_lightweight / 100.0) + ", rx : " + (sum_rx / 100.0));