java - RxJava - 调度程序与 ExecutorService?

标签 java concurrency rx-java

我有一种预感,对于 RxJava 中的高度计算、并行化任务,传统的 ExecutorService 会比 Scheduler 更快。

我有一个理论,这段代码

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

所以我的粗略测试表明,传统的 ExecutorService 在计算方面比 Scheduler 快得多。

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

最佳答案

我做了几次测试,发现创建自己的 ExecutorService 实际上可以提高并行化性能。 I wrote a blog post on it here .

关于java - RxJava - 调度程序与 ExecutorService?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34997292/

相关文章:

java - 如果发生异常,如何停止 Executor 服务中的 Callable 任务

ArrayList处理中的java.util.ConcurrentModificationException

android - 如何从 Hashmap 创建一个可观察对象?

java - 使用 TestSubscriber 测试 RxJava 异常

java - 尝试将二进制文件返回到浏览器时出现 406 错误

java - LinkedHashMap 后进先出还是先进先出?

java - 例如,调用 notifyAll 的顺序如何影响 Java 中的执行?

kotlin - 如何使用 Observable.zip 保存类型?

java - 比较像素颜色 - Java

java - 即使solve() 方法返回 true,IloCplex.solve() 仍无法满足所有约束