2017-01-26 11 views
2

次のコードスニペットのパフォーマンスの違いは何ですか?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つずつトリガされてからすべてマージされるケースです。

答えて

1

(両方のCouchbase SDKとRxJavaの観点から、彼らは非常に似ている、2つのスニペットの間には、性能差があってはなりませんループ)。

編集:個人的な観点から、私はまだかかわらず、最初のスタイルを好む;)

1

flatMap各キーに対してマッパー機能を呼び出すと、これらの呼び出しの結果がマージされます。私は、この合併アルゴリズムがmergeで使用されているアルゴリズムと異なるとは思わない。したがって、bucket.get()が非ブロッキングである場合、2つの間にパフォーマンスの違いはありません。

スニペット#1はわかりやすく表示されます。 flatMapは基本的にmapあなたkeys.forEachようObservablesに、そしてmerge観測ではそうであるように

+0

はちょうど質問をより明確にするために、第2のスニペットを編集し、同意します。 RX賢明、私はパフォーマンスが同一でなければならないことを理解する。これらの2つの例を呼び出す際にSDKが内部バッファとリソースをどのように管理するかに違いがあるのだろうかと思います。 – shays10

+1

@ shays10同じアルゴリズムで、私は同じか非常によく似た内部実装を意味します。したがって、いかなる面においても相違はないはずです。 –

関連する問題