以下代码片段之间的性能差异是什么?
用例:使用 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 方法,然后将它们全部合并。