我一直因为缺乏准确性而感到困扰,我看到system.time
和rbenchmark
的基准标记(因为计时的精度可能缺乏),并且看到 Hadley 最近引用了microbenchmark
包。 所以我决定试一试,如下所示。 我mean
与f <- function(x) {sum(x)/length(x)}
对立,并期望mean
比f
做得更好,但据我所知,结果并不表明这是真的。
- 我误解了结果吗?
- f 实际上比平均值快吗?
- 微基准测试是否仍处于测试阶段,需要熨烫外?
我在 win 2.15 机器上运行 R7(因为微基准测试根据您的操作系统进行不同的计时)。
结果
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)
我可能是错的,但这对我来说似乎并不奇怪。在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
我想你会发现,如果你把 X 的大小提高 10 倍,你会看到更一致的结果。 老实说,如果你真的可以在具有多任务操作系统的计算机上获得微秒级计时精度,我会感到惊讶。
您还可以考虑:
- 您是在笔记本电脑还是具有自动 CPU 频率缩放功能的机器上运行?
- 热身?
- 将您的流程固定到一个核心。