我第一次在 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