Почему foreach ()%do% иногда медленнее, чем for?

Я впервые экспериментирую с распараллеливанием в R. В качестве первого игрушечного примера я попробовал

library(doMC)
registerDoMC()

B<-10000

myFunc<-function()
{
    for(i in 1:B) sqrt(i)
}

myFunc2<-function()
{
    foreach(i = 1:B)  %do% sqrt(i)
}

myParFunc<-function()
{
    foreach(i = 1:B) %dopar% sqrt(i)
}

. Я знаю, что sqrt()выполняется слишком быстро, чтобы распараллеливание имело значение, но чего я не ожидал, так это того, что foreach() %do%будет медленнее, чем for():

> system.time(myFunc())
   user  system elapsed 
  0.004   0.000   0.005 
> system.time(myFunc2())
   user  system elapsed 
  6.756   0.000   6.759 
> system.time(myParFunc())
   user  system elapsed 
  6.140   0.524   6.096 

. Как видно, foreach() %dopar%сравнивается с foreach() %do%, а не с for(). Так как foreach() %do%было намного медленнее, чем for()в моем игрушечном примере, я немного запутался. Почему-то я подумал, что это эквивалентные способы построения циклов for -. В чем разница? Являются ли они когда-либо эквивалентными? Всегда ли foreach() %do%медленнее?

ОБНОВЛЕНИЕ :Следуя ответу @Peter Fines, я обновляю myFuncследующим образом:

 a<-rep(NA,B)
 myFunc<-function()
 {
     for(i in 1:B) a[i]<-sqrt(i)
 }

Это делает for()немного медленнее, но ненамного:

> system.time(myFunc())
   user  system elapsed 
  0.036   0.000   0.035 
> system.time(myFunc2())
   user  system elapsed 
  6.380   0.000   6.385 
10
задан MånsT 2 May 2012 в 16:26
поделиться