我很难理解为什么这段代码(改编自R基准测试2.5)在迭代次数增加时会变得越来越慢(平均而言)。
require(Matrix)
c <- 0;
for (i in 1:100) {
a <- new("dgeMatrix", x = rnorm(3250 * 3250), Dim = as.integer(c(3250, 3250)))
b <- as.double(1:3250)
invisible(gc())
timing <- system.time({
c <- solve(crossprod(a), crossprod(a, b))
})
print(timing)
rm(a, b, c)
}
这里有一个示例输出,每次运行会略有不同。
据我所知,在每次迭代之间不应该保存任何东西,但是计时器从前几个循环的 1 秒钟慢慢增加到后来的 4 秒钟以上。您有任何想法是什么原因引起的,以及如何解决?
将 for 循环替换为 apply 似乎会产生类似的结果。
我知道代码没有被优化,但是它来自广泛使用的基准测试,并且取决于导致这种行为的原因,它可能表明其结果存在严重偏差(默认情况下只迭代 3 次)。
我在 Mac OS 10.8.4 上运行 R 版本 3.0.1 (x86_64),拥有 16 GB 的 RAM(其中大部分都是空闲的)。BLAS 是 OpenBLAS。
3250-by-3250
的矩阵上获得 ~1 秒的速度吗?你的电脑是不是吃了兴奋剂?还是你测试的时候用的是更小的维度?另一个重要的问题是:这种恶化是暂时的(在那个for
循环的评估内)还是永久的?为了找出答案,在for
循环结束后手动运行几次额外的迭代,告诉我们它们是慢速(4 秒)还是快速(1 秒)。 - flodel