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