我想知道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位)
答案 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'))
答案 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)
我还添加了sample
函数作为基准,看看这是多么“不稳定”。
我个人对异常值并不感到惊讶。此外,即使您为size=10
运行相同的基准,您仍然会得到异常值。它们不是计算的结果,而是整个PC条件(其他脚本运行,内存负载等)
由于