Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

foreach %dopar% slower than for loop [duplicate]

Why foreach() with %dopar% slower than for. Some litle exmaple:

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

Some addition info:

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
like image 591
Artem Klevtsov Avatar asked Jun 06 '13 13:06

Artem Klevtsov


People also ask

Is forEach slower than a for loop?

forEach LoopIt is slower than the traditional loop in performance.

WHY IS for loop faster than forEach?

Deductions. This foreach loop is faster because the local variable that stores the value of the element in the array is faster to access than an element in the array. The forloop is faster than the foreach loop if the array must only be accessed once per iteration.

Why is forEach slower than for JavaScript?

ForEach is 96% slower than for loop. Thanks in advance. It's probably because forEach requires a function call for each element. That doesn't quite explain why it's 96% faster though, you'd expect 50% since you make 1 function call instead of 2 for each element.

Is JavaScript forEach slow?

The forEach method in Javascript iterates over the elements of an array and calls the provided function for each element in order. The execution time of forEach is dramatically affected by what happens inside each iteration. It is fast and designed for functional code.


1 Answers

It is specifically mentioned and illustrated with examples that indeed sometimes it's slower to set this up, because of having to combine the results from the separate parallel processes in the package doParallel.

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

Page 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.

I used the example to find out that in some case, using the package resulted in 50% the time needed to execute the code.

like image 191
PascalVKooten Avatar answered Sep 24 '22 16:09

PascalVKooten