意想不到的结果:microbenchmark

时间:2012-04-28 15:50:45

标签: r microbenchmark

由于缺乏准确性,我总是被一点点跟踪,我看到system.timerbenchmark的基准标记(因为时间的精确度可能不足),并且看到Hadley参考了{最近{1}}包。所以我决定给它一个旋转,如下所示。我将microbenchmarkmean进行了对比,并期望f <- function(x) {sum(x)/length(x)}mean更好,但据我所知,结果并不表明这是真的。

  1. 我误解了结果吗?
  2. f实际上比意味着快吗?
  3. microbenchmark是否还处于beta阶段,需要加以解决 出?
  4. 我正在win 7机器上运行R2.15(因为微基准测试的时间因操作系统而异)。

    结果

    f

    守则

    Unit: microseconds
         expr    min     lq median     uq    max
    1    f(x) 19.130 20.529 20.529 20.996 286.00
    2 mean(x) 28.927 29.860 30.327 30.327 672.31
    

2 个答案:

答案 0 :(得分:9)

我可能错了,但这似乎并不令我感到惊讶。在mean.default可以调用.Internal(mean(x))之前,它必须检查3 if个语句,计算x的长度,然后检查另一个if语句。它的时间差异相当小。

直接拨打.Internal(mean(x)的速度稍快一些:

library(microbenchmark)

x <- 1:10000
f1 <- function(x) {sum(x)/length(x)}
f2 <- function(x) {.Internal(mean(x))}

res <- microbenchmark(
    mean(x), 
    f1(x),
    f2(x), 
times=1000L)

print(res)

Unit: microseconds
     expr    min      lq  median      uq     max
1   f1(x) 32.195 32.4605 32.8850 33.4645 106.997
2   f2(x) 21.840 22.0580 22.2015 22.6270  55.316
3 mean(x) 35.393 35.9840 36.1860 36.4420  91.203

答案 1 :(得分:2)

我想你会发现,如果你将X的大小提高10倍,你会看到更一致的结果。老实说,如果你真的可以在具有多任务操作系统的计算机上获得微秒计时精度,我会感到惊讶。

您可能还会考虑:

  • 您是在笔记本电脑或具有自动CPU频率缩放功能的机器上运行吗?
  • 预热?
  • 将您的流程固定到一个核心。