为什么dopar不减少时间?

时间:2020-05-01 16:50:08

标签: r doparallel

我从这里举了一个例子 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不能减少计时?

1 个答案:

答案 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)

为了期望提高速度,该功能应该足够昂贵,以至于将任务发送给孩子的开销相对较小。