我很难理解为什么随着迭代次数的增加,这段代码(从R Benchmark 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)
}
这是一个sample output,从一次运行到下一次运行略有不同。
据我所知,从一次迭代到下一次迭代都不应该保存,但是时间从前几个循环中的1秒缓慢增加到后面循环中的4秒以上。你知道造成这种情况的原因,以及我如何解决这个问题?
将for循环切换为* apply似乎会产生类似的结果。
我知道代码没有经过优化,但它来自广泛使用的基准测试,并且根据导致此行为的原因,它可能表明其结果存在严重偏差(默认情况下仅迭代3次)。
我在Mac OS 10.8.4上运行R版本3.0.1(x86_64),内存为16 GB(大量免费)。 BLAS是OpenBLAS。
答案 0 :(得分:1)
一种解决方案是使用编译器包将代码编译为字节代码。这应该消除奇怪的时序问题,因为它将在每次迭代时调用相同的编译代码。它还应该使您的代码更快。要在代码上启用编译器,请在下面添加以下两行:
library(compiler)
enableJIT(3)
如果编译代码没有消除问题,那么可疑问题的集合将会缩小。
答案 1 :(得分:0)
也许您可以尝试将for循环中的代码转换为函数。通过这种方式,一次运行确实无法影响另一种运行方式。此外,它还消除了由于过多的rm()和gc()使用造成的混乱。
require(Matrix)
NewFun <- function() {
a <- new("dgeMatrix", x = rnorm(3250 * 3250), Dim = as.integer(c(3250, 3250)))
b <- as.double(1:3250)
timing <- system.time({
c <- solve(crossprod(a), crossprod(a, b))
})
print(timing)
}
for (i in 1:100) {
NewFun()
}