2014-09-05 115 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

相關問題