初めて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%
と比較されています。私のおもちゃの例よりもはるかに遅かったので、少し混乱しています。どういうわけか、これらは for ループを構築する同等の方法だと思いました。違いはなんですか?それらは同等ですか?いつも遅いですか?foreach() %do%
for()
foreach() %do%
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