Observable 相对于 Flowable 的实际优势是什么?
What are the actual advantages of Observable over Flowable?
What's different in 2.0描述了Observable
和Flowable
之间的区别。但是,Observable
主要是根据它与 Flowable
相比所缺少的功能来描述的。 Observable
只提到了一个显着特征:
Using Observable
has lower overhead in general than Flowable
.
但这似乎与 Observable
对于少量元素更可取并且如果任务太重则更有可能导致 OutOfMemoryError
的建议相矛盾。这似乎表明 Flowable
通常更有效率。
另一件让我感到困惑的事情是,如果 Observable
是元素少于 1K 的用例的首选,而 Flowable
是元素超过 10K 的用例的首选,那么用例有1K 和 10K 之间的元素是灰色区域。
是否有关于 Observable
和 Flowable
之间差异的更技术性的解释? 特别是建议一种实用的启发式方法来决定在1K 和 10K 元素之间的灰色区域,或者当元素数量未知或可能发生变化时。
相关:仅引用文档,不作进一步解释。
Is there a more technical explanation of the differences between Observable and Flowable?
我会给你一个,但大多数人都被技术细节吓到了。
However, Observable is mostly described in terms of features that it lacks in comparison to Flowable.
是的,因为从技术上讲 Observable
是 Flowable
减去所有运算符上与背压相关的请求协调逻辑。
But even this seems to be contradicted by the suggestion ...
没有矛盾,通过 Observable
从一端到另一端获取值遇到较少 "resistance" 因为逻辑不必处理请求协调或临时缓冲。例如,Observable.flatMapIterable
不必对源项进行排队,因为每个内部 Iterable
都可以立即从 onNext
中完整流式传输。 Flowable
必须排队项目,蹦床排空和可迭代项目排放,并在与直接排放相比相当昂贵的队列排放逻辑中将其限制在请求的数量。
This seems to suggest that Flowable is generally more efficient.
内存使用(因此 GC 开销)和延迟之间存在权衡。
Then use cases having between 1K and 10K elements are a gray area.
这意味着在这两个数字之间,您可能需要找到其他决策变量,例如单个元素大小、预期延迟、您 app/system 的其余部分在做什么等。
or when the number of elements is unknown or may change
Observable
的情况使用单词 "longest",这意味着在任何给定时间,您可能有 1000 个或更少元素的缓冲序列,或者您的源最多发出 1平均每毫秒元素。
这是一个典型的 "depends" 案例:
- 来源能否合理背压?
- 处理逻辑通常比源或其上层慢吗?
- 不同的订阅者会遇到不同数量的元素吗?
- 环境是否以某种方式受到限制?
- 物品比较大吗?
如果您对这些问题的回答是肯定的,那么您最好选择 Flowable
。
Observable
和 Flowable
非常相似。 Flowable
较新,通常更高级:
- 它实现了背压
- 符合JavaReactive Streams规范(将包含在JDK9中)
Observable
仍然存在的原因是与原始 Microsoft 的 ReactiveX 框架在概念上的兼容性。记住 RxJava 是 ReactiveX project.
的一部分
在大多数(甚至所有)情况下,我建议 Flowable
而不是 Observable
。除非您正在从事 Java 部分不占主导地位的多语言项目。
What's different in 2.0描述了Observable
和Flowable
之间的区别。但是,Observable
主要是根据它与 Flowable
相比所缺少的功能来描述的。 Observable
只提到了一个显着特征:
Using
Observable
has lower overhead in general thanFlowable
.
但这似乎与 Observable
对于少量元素更可取并且如果任务太重则更有可能导致 OutOfMemoryError
的建议相矛盾。这似乎表明 Flowable
通常更有效率。
另一件让我感到困惑的事情是,如果 Observable
是元素少于 1K 的用例的首选,而 Flowable
是元素超过 10K 的用例的首选,那么用例有1K 和 10K 之间的元素是灰色区域。
是否有关于 Observable
和 Flowable
之间差异的更技术性的解释? 特别是建议一种实用的启发式方法来决定在1K 和 10K 元素之间的灰色区域,或者当元素数量未知或可能发生变化时。
相关:
Is there a more technical explanation of the differences between Observable and Flowable?
我会给你一个,但大多数人都被技术细节吓到了。
However, Observable is mostly described in terms of features that it lacks in comparison to Flowable.
是的,因为从技术上讲 Observable
是 Flowable
减去所有运算符上与背压相关的请求协调逻辑。
But even this seems to be contradicted by the suggestion ...
没有矛盾,通过 Observable
从一端到另一端获取值遇到较少 "resistance" 因为逻辑不必处理请求协调或临时缓冲。例如,Observable.flatMapIterable
不必对源项进行排队,因为每个内部 Iterable
都可以立即从 onNext
中完整流式传输。 Flowable
必须排队项目,蹦床排空和可迭代项目排放,并在与直接排放相比相当昂贵的队列排放逻辑中将其限制在请求的数量。
This seems to suggest that Flowable is generally more efficient.
内存使用(因此 GC 开销)和延迟之间存在权衡。
Then use cases having between 1K and 10K elements are a gray area.
这意味着在这两个数字之间,您可能需要找到其他决策变量,例如单个元素大小、预期延迟、您 app/system 的其余部分在做什么等。
or when the number of elements is unknown or may change
Observable
的情况使用单词 "longest",这意味着在任何给定时间,您可能有 1000 个或更少元素的缓冲序列,或者您的源最多发出 1平均每毫秒元素。
这是一个典型的 "depends" 案例:
- 来源能否合理背压?
- 处理逻辑通常比源或其上层慢吗?
- 不同的订阅者会遇到不同数量的元素吗?
- 环境是否以某种方式受到限制?
- 物品比较大吗?
如果您对这些问题的回答是肯定的,那么您最好选择 Flowable
。
Observable
和 Flowable
非常相似。 Flowable
较新,通常更高级:
- 它实现了背压
- 符合JavaReactive Streams规范(将包含在JDK9中)
Observable
仍然存在的原因是与原始 Microsoft 的 ReactiveX 框架在概念上的兼容性。记住 RxJava 是 ReactiveX project.
在大多数(甚至所有)情况下,我建议 Flowable
而不是 Observable
。除非您正在从事 Java 部分不占主导地位的多语言项目。