我目前正在测试R中的一些性能关键算法,我正在寻找一种简单的方法来完成这些基准测试并获得清晰的总结。所以我找到了经常使用的rbenchmark
包。但这并不适合我的需要。我的算法通常依赖于某些参数,或者有不同的"典型的"应该可以批量测试的数据集。
我目前的快速解决方案是(有一个非常愚蠢但很简单的例子,其中max / median在10 ^ 6和5 * 10 ^ 6随机数上进行测试)
library(rbenchmark)
multi.benchmarks <- function(..., settings) {
res <- NULL
for (i in 1:length(settings)) {
env <- new.env()
eval(settings[[i]], env)
tres <- benchmark(..., environment = env)
res <- rbind(res, cbind(names(settings)[i], tres))
}
names(res)[1] <- "setting"
return(res)
}
multi.benchmarks(mean = expression(mean(x)), median = expression(median(x)),
settings = list(s1 = expression({x <- runif(1E6)}),
s2 = expression({x <- runif(5E6)})),
replications = 3)
返回:
setting test replications elapsed relative user.self sys.self user.child sys.child
1 s1 mean 3 0.00 NA 0.00 0.00 NA NA
2 s1 median 3 0.16 NA 0.14 0.01 NA NA
3 s2 mean 3 0.03 1 0.04 0.00 NA NA
4 s2 median 3 0.57 19 0.51 0.07 NA NA
这或多或少是我想要的,但我仍然缺少:
substitute(...)
等方式读取表达式)和my_benchmark(algorithm(dataset, a, b), algorithm = list(func1, func2), a = list(1,2), b = list(10, 20), replications = 3)
是运行8种不同基准测试的好方法:对于func1 / func2的所有组合以及a
和b
的所有可能值。func1
包含参数a
且b
且func2
只有参数a
但不是b
},那么我们将只有6种可能的组合。可能只花了几天的时间来编写一个能够对所有这些事情做的基准测试程序包并且仍然对rbenchmark有某种向下兼容性,但在我开始这样做之前,我想问一下你:
答案 0 :(得分:2)
“寻找工具”问题不再适合,所以有人会很快将其拍下来。
但是看看microbenchmark
,它至少会返回一组结果,所以你可以做更多的摘要 - 我在RcppZiggurat包/插图中使用了一些自定义的“小提琴”图。
最后但并非最不重要的是,一个新的'meta'基准测试包可能很有意义,特别是如果你将它与现有的时序/分析/基准测试包很好地集成,而不是重新发明(或多或少)同一个轮子。