计算时间!=

时间:2014-12-08 11:45:12

标签: r microbenchmark

我想知道a!=0!a==0快多少并使用R包微基准测试。 这是代码(如果你的电脑很慢,减少3e6和100):

library("microbenchmark")
a <- sample(0:1, size=3e6, replace=TRUE)
speed <- microbenchmark(a != 0, ! a == 0, times=100)
boxplot(speed, notch=TRUE, unit="ms", log=F)

每次,我都得到一个类似下面的情节。 正如预期的那样,第一个版本比第二个版本(33毫秒)更快(中位数为26毫秒)。

但是这些极低值(异常值)来自何处呢?是一些内存管理效果?如果我将时间设置为10,则没有异常值......

编辑:sessionInfo():R版本3.1.2(2014-10-31)平台:x86_64-w64-mingw32 / x64(64位)

computation time unequal and not_equal

2 个答案:

答案 0 :(得分:2)

你说在times=10时你没有异常值,但是microbenchmark多次运行times=10并且你可能会看到奇怪的异常值。以下是times=100的一次运行与times=10的十次运行的比较,其中显示在两种情况下均出现异常值。

根据表达式中涉及的对象的大小,我想象当你的机器遇到内存限制时会出现异常值,但是它们也可能由于CPU压力而发生,例如:由于非R过程。

a <- sample(0:1, size=3e6, replace=TRUE)
speed1 <- microbenchmark(a != 0, ! a == 0, times=100)
speed1 <- as.data.frame(speed1)

speed2 <- replicate(10, microbenchmark(a != 0, ! a == 0, times=10), simplify=FALSE)
speed2 <- do.call(rbind, lapply(speed2, cbind))

times <- cbind(rbind(speed1, speed2), method=rep(1:2, each=200))
boxplot(time ~ expr + method, data=times, 
        names=c('!=; 1x100', '!==; 1x100', '!=; 10x10', '!==; 10x10'))

enter image description here

答案 1 :(得分:0)

我认为这种比较是不公平的。当然你会得到异常值,计算时间取决于几个因素(垃圾收集,缓存结果等),所以这并不奇怪。您在所有基准测试中使用相同的向量a,因此缓存肯定会发挥作用。

我通过在计算之前随机化a变量调整了一点过程,得到了相对可比的结果:

library("microbenchmark")
do.not<-function() {
   a <- sample(0:1, size=3e6, replace=TRUE)
   a!=0;
}

do<-function() {
   a <- sample(0:1, size=3e6, replace=TRUE)
   a==0;
}

randomize <- function() {
   a <- sample(0:1, size=3e6, replace=TRUE)
}


speed <- microbenchmark(randomize(), do.not(), do(), times=100)
boxplot(speed, notch=TRUE, unit="ms", log=F)

Boxplot

我还添加了sample函数作为基准,看看这是多么“不稳定”。

我个人对异常值并不感到惊讶。此外,即使您为size=10运行相同的基准,您仍然会得到异常值。它们不是计算的结果,而是整个PC条件(其他脚本运行,内存负载等)

由于