以下代码段之间的性能差异是什么?
使用案例:使用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方法,然后将它们全部合并。
答案 0 :(得分:1)
它为每个键调用映射器函数flatMap
,然后合并这些调用的结果。我不认为这种合并算法与merge
中使用的算法有任何不同。因此,如果bucket.get()
是非阻塞的,那么两者之间应该没有性能差异。
Snippet#1看起来更具可读性。
答案 1 :(得分:1)
两个片段之间应该没有性能差异,从Couchbase SDK和RxJava的角度来看,它们非常相似(因为flatMap
基本上是map
到Observables
比如你的keys.forEach,然后是merge
循环中的观察者。)
编辑:从个人的角度来看,我仍然喜欢第一种风格;)