9

我总是被我看到基准标记和system.timerbenchmark(因为时间的精度可能缺乏)缺乏准确性而有点困扰,并且microbenchmark最近看到哈德利参考了这个包。所以我决定试一试,如下所示。我mean反对f <- function(x) {sum(x)/length(x)}并期望mean做得更好,f但据我了解,结果并不表明这是真的。

  1. 我误解了结果吗?
  2. f 实际上比平均值快吗?
  3. 微基准测试是否仍处于测试阶段,是否需要解决?

我在 win 7 机器上运行 R2.15(因为 microbenchmark 的计时取决于您的操作系统)。

结果

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

编码

library(microbenchmark)

x <- 1:10000
f <- function(x) {sum(x)/length(x)}
mean(x)

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

print(res)
boxplot(res)
4

2 回答 2

10

我可能是错的,但这对我来说似乎并不那么令人惊讶。在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
于 2012-04-28T16:07:55.363 回答
2

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

您还可以考虑:

  • 您是在笔记本电脑上运行还是在具有自动 CPU 频率缩放功能的机器上运行?
  • 暖身?
  • 将您的流程固定在一个核心上。
于 2012-04-28T16:15:05.533 回答