Я впервые экспериментирую с распараллеливанием в 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