performance - foreach %dopar% 比 for 循环慢

标签 performance r loops foreach

这个问题在这里已经有了答案:





Why is the parallel package slower than just using apply?

(3 个回答)


8年前关闭。




为什么foreach()%dopar%for 慢.一些小例子:

library(parallel)
library(foreach)
library(doParallel)
registerDoParallel(cores = detectCores())

I <- 10^3L

for.loop <- function(I) {
  out <- double(I)
  for (i in seq_len(I))
    out[i] <- sqrt(i)
  out
}

foreach.do <- function(I) {
  out <- foreach(i = seq_len(I), .combine=c) %do%
    sqrt(i)
  out
}

foreach.dopar <- function(I) {
  out <- foreach(i = seq_len(I), .combine=c) %dopar%
    sqrt(i)
  out
}

identical(for.loop(I), foreach.do(I), foreach.dopar(I))
## [1] TRUE
library(rbenchmark)
benchmark(for.loop(I), foreach.do(I), foreach.dopar(I))
##               test replications elapsed relative user.self sys.self user.child sys.child
## 1      for.loop(I)          100   0.696    1.000     0.690    0.000        0.0     0.000
## 2    foreach.do(I)          100 121.096  173.989   119.463    0.056        0.0     0.000
## 3 foreach.dopar(I)          100 120.297  172.841   111.214    6.400        3.5     6.734

一些补充信息:
sessionInfo()
## R version 3.0.0 (2013-04-03)
## Platform: x86_64-unknown-linux-gnu (64-bit)
## 
## locale:
##  [1] LC_CTYPE=ru_RU.UTF-8       LC_NUMERIC=C               LC_TIME=ru_RU.UTF-8       
##  [4] LC_COLLATE=ru_RU.UTF-8     LC_MONETARY=ru_RU.UTF-8    LC_MESSAGES=ru_RU.UTF-8   
##  [7] LC_PAPER=C                 LC_NAME=C                  LC_ADDRESS=C              
## [10] LC_TELEPHONE=C             LC_MEASUREMENT=ru_RU.UTF-8 LC_IDENTIFICATION=C       
## 
## attached base packages:
## [1] parallel  stats     graphics  grDevices utils     datasets  methods   base     
## 
## other attached packages:
## [1] doMC_1.3.0       rbenchmark_1.0.0 doParallel_1.0.1 iterators_1.0.6  foreach_1.4.0    plyr_1.8        
## 
## loaded via a namespace (and not attached):
## [1] codetools_0.2-8 compiler_3.0.0  tools_3.0.0

getDoParWorkers()
## [1] 4

最佳答案

特别提到并用示例说明了确实有时设置它会更慢,因为必须组合来自包 doParallel 中的单独并行进程的结果。

引用:http://cran.r-project.org/web/packages/doParallel/vignettes/gettingstartedParallel.pdf

第 3 页:

With small tasks, the overhead of scheduling the task and returning the result can be greater than the time to execute the task itself, resulting in poor performance.



我用这个例子发现,在某些情况下,使用包导致执行代码所需的时间减少 50%。

关于performance - foreach %dopar% 比 for 循环慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16963808/

相关文章:

mysql - 在一个查询中对一个表中的不同值求和

c# - 提取 zip、解析文件并扁平化为 CSV

加载库时 R rgl 包错误

r - 使用循环或应用覆盖多个字符串变量

javascript - 按时间间隔链接相似元素修改

java - 在java上检查列表是否为空会影响性能吗?

java - 在 Activity 中使用内部 BroadcastReceiver 时出现内存问题

r - 如何单击 javascript "link"?是我的 xpath 还是我的 relenium/selenium 用法?

r - 创建一个 Y 变量,它是 X 变量的计数

java - 尝试为出生年份创建 do while 循环