RxJava - 调度程序与ExecutorService?

tmn*_*tmn 15 java concurrency rx-java

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

我有一个理论,这个代码

Observable<MyItem> source = ...

source.flatMap(myItem -> myItem.process().subscribeOn(Schedulers.computation()))
.subscribe();
Run Code Online (Sandbox Code Playgroud)

会跑得比这慢

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();
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

所以我的粗略测试表明传统ExecutorServiceScheduler计算更快.

这些结果有原因吗?RxJava调度程序是否未针对并行化进行优化?我得到的结论是计算调度程序使用的线程比执行程序少.

tmn*_*tmn 12

我做了几次测试,发现创建自己的ExecutorService可以实际上提高并行化性能.我在这里写了一篇博文.