我有一个预感,在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调度程序没有针对并行处理进行优化吗?我已经得出的印象是,计算调度程序使用的线程比Executors少。
ExecutorService
жҜ”Schedulers.computation()
жӣҙеҝ«пјҢиҝҷд»Қ然жҳҜдёҖдёӘеҘҪй—®йўҳгҖӮжҲ‘жІЎжңүиө„ж јеӣһзӯ”иҝҷдёӘй—®йўҳгҖӮ - Dan LewSchedulers.computation
为每个工作线程使用Executors.newScheduledThreadPool(1, threadFactory)
。 - zsxwing