次のコードスニペットのパフォーマンスの違いは何ですか?Couchbase RXクライアント - 複数の観測値とフラットマップのマージ
使用例:CouchbaseリアクティブSDKを使用して、複数のキーをCouchbaseから取得します。
スニペット#1
return Observable
.from(keys)
.flatMap(id ->
bucket.get(id, RawJsonDocument.class)
)
.toList()
.toBlocking()
.single();
スニペット#2
List<Observable<RawJsonDocument>> list = new ArrayList<>();
keys.forEach(key -> list.add(bucket.get(key, RawJsonDocument.class)));
return Observable.merge(list)
.toList()
.toBlocking()
.single();
最初のスニペットは非常に観察可能である端部に、またCBのdocumentation.
に従って推奨される方法でありますブロックされたものに変換されます、 アグリゲーションは、完全に非同期的に発生しています。要求が非常に迅速に内部要求 リングバッファに格納し、I/Oスレッドが彼らができる ほどの大きなバッチを選択することができます。されているので、これははるかに効率的なリソースの利用 を提供SDK、インサイド
その後、どのサーバーが最初に結果を返すにしても、リストには が格納されているため、 の応答のシリアル化は行われません。
2番目のスニペットは今日のコードベースではObservablesのリストがあり、それぞれの観測でバケットのgetメソッドが1つずつトリガされてからすべてマージされるケースです。
はちょうど質問をより明確にするために、第2のスニペットを編集し、同意します。 RX賢明、私はパフォーマンスが同一でなければならないことを理解する。これらの2つの例を呼び出す際にSDKが内部バッファとリソースをどのように管理するかに違いがあるのだろうかと思います。 – shays10
@ shays10同じアルゴリズムで、私は同じか非常によく似た内部実装を意味します。したがって、いかなる面においても相違はないはずです。 –