2014-09-05 108 views
1

我目前正在测试R中的一些性能关键算法,我正在寻找一种简单的方法来完成这些基准测试并获得清晰的总结。所以我找到了经常使用的rbenchmark包。但这并不适合我的需求。我的算法通常取决于某些参数,或者有不同的“典型”数据集,应该可以批量测试。R中基准(性能分析)的最佳方式是什么?

我的电流速正脏溶液是(与其中max /中位数是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 

这或多或少是我想要的,但我仍然失踪:

  • 一个简单的语法(表达式读v ia 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的所有组合。
  • 检测一些并不需要的PARAMS:如果func1有参数abfunc2只是有一个参数a但不b,那么我们将只有6种可能的组合。
  • 更详细的输出,例如可以选择获得N个重复后所有运行时间的平均值和标准偏差的额外列。

也许它会花费我只是几天的时间写一个基准包,它能够做所有这些事情,仍然有某种向下兼容于rbenchmark,但在我开始做这个,我会喜欢问你:

  • 是否还有其他值得推荐的基准解决方案,我应该考虑?
  • 您是否认为具有此类功能的更复杂的基准测试包对R社区普遍感兴趣? (我正在考虑一个新的软件包)
+0

查看Hadley Wickham的[Performance](http://adv-r.had.co.nz/Performance.html) – zx8754 2014-09-05 13:02:06

回答

2

“寻找一个工具”的问题不再被认为是合适的,所以有人会很快将它拍下来。

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

最后但并非最不重要的一点是,新的'meta'基准测试套件可能很有意义,尤其是如果您将其与现有的时序/性能分析/基准测试套件很好地集成在一起,而不是重新发明(或多或少)同一个车轮。

+0

感谢您使用'microbenchmark'的想法!我知道这里的问题不应该是关于意见的讨论,但我希望提供我现有的方法将这个问题集中在R的基准测试技术方面。 – 2014-09-05 12:58:34

相关问题