2

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

用例:使用 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 的文档,第一个片段是推荐的方式。

此外,在最后,可观察对象被转换为阻塞对象,但在此之前的一切,包括网络调用和聚合,都是完全异步发生的。

在 SDK 内部,这提供了更有效的资源利用,因为请求非常快速地存储在内部请求 RingBuffer 中,并且 I/O 线程能够选择尽可能大的批次。之后,无论服务器首先返回结果,它都会存储在列表中,因此不会对响应进行序列化。

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

4

2 回答 2

1

flatMap它为每个键调用映射器函数,然后合并这些调用的结果。我不希望这种合并算法与merge. 所以在bucket.get()非阻塞的情况下,两者之间应该没有性能差异。

Snippet #1 对我来说更具可读性。

于 2017-01-26T12:43:36.340 回答
1

这两个片段之间应该没有性能差异,从 Couchbase SDK 和 RxJava 的角度来看,它们非常相似(flatMap基本上是map为了Observables喜欢你的 keys.forEach,然后merge是循环中的 observables)。

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

于 2017-01-27T11:46:28.953 回答