Couchbase RX Client - 合并多个observable与flatmap

时间:2017-01-26 11:22:27

标签: java performance rx-java couchbase couchbase-java-api

以下代码段之间的性能差异是什么?

使用案例:使用Couchbase响应式SDK从Couchbase检索多个密钥。

Snippet#1

 return Observable
            .from(keys)
            .flatMap(id ->
                    bucket.get(id, RawJsonDocument.class)
            )
            .toList()
            .toBlocking()
            .single();

Snippet#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.

推荐的方式
  

此外,在最后,observable被转换为阻塞的,   但在此之前的一切,包括网络电话和   聚合,完全是异步发生的。

     

在SDK中,这提供了更有效的资源利用率   因为请求非常快速地存储在内部请求中   RingBuffer和I / O线程能够选择大到的批次   他们能。之后,无论什么服务器首先返回结果   存储在列表中,因此没有响应的序列化   上。

第二个片段是我们今天在代码库中找到的一个案例,其中有一个Observable列表,其中每个observable逐个触发Bucket的get方法,然后将它们全部合并。

2 个答案:

答案 0 :(得分:1)

它为每个键调用映射器函数flatMap,然后合并这些调用的结果。我不认为这种合并算法与merge中使用的算法有任何不同。因此,如果bucket.get()是非阻塞的,那么两者之间应该没有性能差异。

Snippet#1看起来更具可读性。

答案 1 :(得分:1)

两个片段之间应该没有性能差异,从Couchbase SDK和RxJava的角度来看,它们非常相似(因为flatMap基本上是mapObservables比如你的keys.forEach,然后是merge循环中的观察者。)

编辑:从个人的角度来看,我仍然喜欢第一种风格;)