我正在尝试使用 doParallel 和 foreach 包,但是使用此处CRANpage找到的指南中的引导示例会降低性能。
library(doParallel)
library(foreach)
registerDoParallel(3)
x <- iris[which(iris[,5] != "setosa"), c(1,5)]
trials <- 10000
ptime <- system.time({
r <- foreach(icount(trials), .combine=cbind) %dopar% {
ind <- sample(100, 100, replace=TRUE)
result1 <- glm(x[ind,2]~x[ind,1], family=binomial(logit))
coefficients(result1)
}
})[3]
ptime
此示例返回56.87
.
当我将 更改dopar
为只是do
顺序运行而不是并行运行时,它会返回36.65
.
如果我这样做registerDoParallel(6)
,它会将并行时间缩短到42.11
但仍然比顺序慢。 仍然比顺序更糟糕registerDoParallel(8)
。40.31
如果我增加到trials
100,000,则顺序运行需要417.16
3 个工人的并行运行597.31
。有 6 个并行工作人员需要425.85
.
我的系统是
戴尔 Optiplex 990
Windows 7 专业版 64 位
16GB 内存
Intel i-7-2600 3.6GHz 四核超线程
我在这里做错了吗?如果我做我能想到的最做作的事情(用 替换计算代码Sys.sleep(1)
),那么我会得到与工人数量密切相关的实际减少。我想知道为什么指南中的示例会降低我的性能,而对他们来说却加快了速度?