RxJava - Schedulers vs ExecutorService?

2022-09-03 02:01:51

我有一种预感,对于RxJava中高度计算的并行化任务,传统的任务将比.ExecutorServiceScheduler

我有一个理论,这个代码

Observable<MyItem> source = ...

source.flatMap(myItem -> myItem.process().subscribeOn(Schedulers.computation()))
.subscribe();

会比这更慢地运行

final ExecutorService svc = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors() + 1);
Observable<MyItem> source = ...

source.flatMap(myItem -> myItem.process().subscribeOn(Schedulers.from(svc)))
.finallyDo(svc::shutdown)
.subscribe();

我将这两种方法与我在工作中执行的典型并行过程进行了比较,并得到了以下结果。

EXECUTOR

START: 2016-01-25T09:47:04.350
END: 2016-01-25T09:48:37.181
TOTAL TIME (SEC): 92


COMPUTATION SCHEDULER

START: 2016-01-25T09:50:37.799
END: 2016-01-25T09:54:23.674
TOTAL TIME (SEC): 225

因此,我的粗略测试表明,传统的计算速度比计算快得多。ExecutorServiceScheduler

这些结果有原因吗?RxJava 调度程序是否只是没有针对并行化进行优化?我得到的印象是,计算调度程序使用的线程比执行器少。


答案 1

我做了几个测试,发现创建自己的并行化实际上可以提高并行化性能。我在这里写了一篇关于它的博客文章ExecutorService


答案 2

使用 时,所有事件都在同一线程中处理。您可以参考源代码和 .此实现的好处是,如果在事件 B 之后发出事件 A,则事件 A 将在事件 B 之后处理。Schedulers.computation()CachedThreadScheduler.javaNewThreadWorker.java

使用 时,事件在不同的线程中处理。Schedulers.from()


推荐