我从这里举了一个例子 https://cran.r-project.org/web/packages/doParallel/vignettes/gettingstartedParallel.pdf
library(doParallel)
cl <- makeCluster(2)
registerDoParallel(cl)
system.time(foreach(i=1:10000) %dopar% sqrt(i))
system.time(foreach(i=1:10000) %do% sqrt(i))
stopCluster(cl)
这是我的输出
Loading required package: foreach
Loading required package: iterators
Loading required package: parallel
> system.time(foreach(i=1:10000) %dopar% sqrt(i))
user system elapsed
6.307 0.537 7.499
> system.time(foreach(i=1:10000) %do% sqrt(i))
user system elapsed
4.581 0.035 4.622
为什么用dopar不能减少计时?
答案 0 :(得分:2)
我放慢速度。您需要记住,进行并行计算会产生开销:
2个节点:
library(doParallel)
cl <- makeCluster(2)
registerDoParallel(cl)
system.time(foreach(i=1:10000) %dopar% sqrt(i))
# user system elapsed
# 1.71 0.26 2.13
system.time(foreach(i=1:10000) %do% sqrt(i))
# user system elapsed
# 1.36 0.00 1.36
stopCluster(cl)
12个节点:
cl <- makeCluster(12)
registerDoParallel(cl)
system.time(foreach(i=1:10000) %dopar% sqrt(i))
# user system elapsed
# 1.92 0.14 2.09
system.time(foreach(i=1:10000) %do% sqrt(i))
# user system elapsed
# 1.28 0.00 1.28
stopCluster(cl)
对于这样一个简单的功能,您不能期望时间会因节点数而减少。
比较:
heavy_computation <- function(i) {
Sys.sleep(0.1)
1 + i
}
cl <- makeCluster(12)
registerDoParallel(cl)
system.time(foreach(i=1:100) %dopar% heavy_computation(i))
# user system elapsed
# 0.03 0.00 0.95
system.time(foreach(i=1:100) %do% heavy_computation(i))
# user system elapsed
# 0.00 0.00 10.28
stopCluster(cl)
为了期望提高速度,该功能应该足够昂贵,以至于将任务发送给孩子的开销相对较小。