R中基准测试(性能分析)的最佳方法是什么?

时间:2014-09-05 12:36:50

标签: r package benchmarking

我目前正在测试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的所有组合以及ab的所有可能值。
  • 检测不需要哪些参数:如果func1包含参数abfunc2只有参数a但不是b },那么我们将只有6种可能的组合。
  • 更详细的输出,例如在N次复制后获得所有运行时的平均值和标准差的附加列的选项。

可能只花了几天的时间来编写一个能够对所有这些事情做的基准测试程序包并且仍然对rbenchmark有某种向下兼容性,但在我开始这样做之前,我想问一下你:

  • 我应该考虑使用其他可推荐的R基准解决方案吗?
  • 您是否认为具有此类功能的更复杂的基准测试包在R社区中具有普遍意义? (我正在考虑一个新包装)

1 个答案:

答案 0 :(得分:2)

“寻找工具”问题不再适合,所以有人会很快将其拍下来。

但是看看microbenchmark,它至少会返回一组结果,所以你可以做更多的摘要 - 我在RcppZiggurat包/插图中使用了一些自定义的“小提琴”图。

最后但并非最不重要的是,一个新的'meta'基准测试包可能很有意义,特别是如果你将它与现有的时序/分析/基准测试包很好地集成,而不是重新发明(或多或少)同一个轮子。