Rでベンチマークテスト

コードの速度を計測したい場合に system.time で計測する方が多いんじゃないかなぁと思うんですが,使いにくくありませんか?
ってなわけで作ってみました.めちゃくちゃ単純ですが…

test <- function(code, ic = 1000) {
    expr <- substitute(code)
    print(system.time(for (i in 1:ic) {
        eval(expr)
    }))   
}

こちらからダウンロードも可能です

デモ

行列の生成

行列を作成する時に第1引数 (data) の長さが足りない場合に自動的に補完(data を繰り返す)してくれるのですが,
それを知っていながらも rep を使って書いていることがありました.
どっちがいいかは一目瞭然.R のコードで補完してるわけじゃないので当たり前ですね…

> test(matrix(1:100, 100, 1000))
   user  system elapsed 
  0.501   0.078   0.579 
> test(matrix(rep(1:100, 1000), 100, 1000))
   user  system elapsed 
  3.016   0.134   3.152 

関数で return は使うべきか?

関数で return を使わない方が速いという噂を耳にしたことがありますが,何度も計測して有意差も調べなければならなそうです.

> test((function(x) return(x))(1:1000), ic = 1000000)
   user  system elapsed 
  6.744   0.010   6.757 
> test((function(x) x)(1:1000), ic = 1000000)
   user  system elapsed 
  6.592   0.014   6.609 

ブレースで括れば複数行もいけちゃいます

> test({
+ cat("first line\n")
+ cat("second line\n")
+ }, 5)
first line
second line
first line
second line
first line
second line
first line
second line
first line
second line
   user  system elapsed 
      0       0       0 
広告
Unicode正規化用のWeb APIを作ってみた Rのrepmat実装を修正しました
※このエントリーははてなダイアリーから移行したものです。過去のコメントなどはそちらを参照してください