【问题标题】:Calculation time !=计算时间!=
【发布时间】:2014-12-08 11:45:12
【问题描述】:

我想知道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)

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

但是这几个非常高的值(异常值)是从哪里来的呢?那是一些内存管理效果吗?如果我将时间设置为 10,则没有异常值...

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

【问题讨论】:

  • 我不认为这很容易追踪;即使使用times=10 左右,我也看到了类似的结果。请记住microbenchmark 不是防弹的。有几个博客指出了它如何收集时间信息的半错误。也可能只是在R 操作的正常过程中不时发生一些其他“事情”——gc 调用,或等待系统级别的 RAM 重新分配等。也许尝试运行一个循环system.time看看结果分布情况如何?

标签: r microbenchmark


【解决方案1】:

您说times=10 时没有异常值,但运行microbenchmarktimes=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'))

【讨论】:

  • 在这个分辨率级别,我认为异常值几乎总是垃圾回收的结果
【解决方案2】:

我认为这种比较有点不公平。当然你会得到异常值,计算时间取决于几个因素(垃圾收集、缓存结果等),所以这并不奇怪。您在所有基准测试中都使用相同的向量 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 条件(其他脚本运行、内存负载等)的结果

谢谢

【讨论】:

  • 你比较!===。不同的时间是在!(a == 0) 中额外调用! 的结果。
猜你喜欢
  • 1970-01-01
  • 2013-01-28
  • 2014-02-18
  • 1970-01-01
  • 2011-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-12
相关资源
最近更新 更多