【R】microbenchmarkの使い方

2022-06-08

スマイルマークの横に使い方と書かれた画像。

Rで実行時間を比較する際にmicrobenchmarkを使うと便利です。もちろんドキュメントはありますが、日本語でまとまった情報が無かったので作りました。

ドキュメント(https://cran.r-project.org/web/packages/microbenchmark/microbenchmark.pdf

基本構文

library(microbenchmark)
microbenchmark(変数 = ベンチマークしたい処理) #変数名を指定しない時は入力されたコマンドのまま表示されます

オプションの指定は少ないと思いますが、以下のように指定できます(ドキュメントから)。

  • list: List of unevaluated expressions to benchmark.
  • times: Number of times to evaluate each expression.
  • unit: Default unit used in summary and print.
  • check: A function to check if the expressions are equal. By default NULL which omits the check. In addition to a function, a string can be supplied. The string ‘equal’ will compare all values using all.equal, ‘equivalent’ will compare all values using all.equal and check.attributes = FALSE, and ‘identical’ will compare all values using identical.
  • control: List of control arguments. See Details.
  • setup: An unevaluated expression to be run (untimed) before each benchmark expression.

複数の処理を比較する場合

microbenchmark(
 変数1 = 処理1, #複数の処理をベンチマークする場合はカンマで区切る
 変数2 = 処理2,
 変数3 = 処理3  #最後は不要
)

複数のコマンドを合わせた処理の場合は{ }でくくって入力します。

使用例(差分計算の時間計測から)

mbench <- microbenchmark(
#forで差分計算(力業)
  "for" = {
    n <- 1
    x <- NA
    for( n in 1:i ){
      if (n == 1){
        x <- Dataset[n, 1]
      }else{
        Dataset[n, "diff_for"] <- Dataset[n, 1] - x
        x <- Dataset[n, 1]
      }
    }
  },
#diffで差分計算
  "diff" = Dataset$diff_diff <- append(NA, diff(Dataset$V1)),
#dplyrで差分計算
  "lag" = Dataset$diff_dplyr <- Dataset$V1 - dplyr::lag(Dataset$V1)
)
#箱ひげ図作成
plot(mbench)
#ベンチマーク結果の一覧表示
mbench

出力

Plot(箱ひげ図)

Plot

見づらい場合はPlotのスケール等を指定してください。

結果

Unit: microseconds
 expr    min      lq      mean  median      uq     max neval cld
  for 8669.2 9309.70 10249.202 9751.90 10476.6 17528.7   100   b
 diff   14.5   19.65    45.687   27.35    37.6  1521.1   100  a 
  lag   43.8   62.80   107.382  110.80   123.7   289.5   100  a 

(おまけ)変数を使わない場合

変更点

#diffで差分計算
  #"diff" = Dataset$diff_diff <- append(NA, diff(Dataset$V1)),
  Dataset$diff_diff <- append(NA, diff(Dataset$V1)),
#dplyrで差分計算
  #"lag" = Dataset$diff_dplyr <- Dataset$V1 - dplyr::lag(Dataset$V1)
  Dataset$diff_dplyr <- Dataset$V1 - dplyr::lag(Dataset$V1)

結果

Unit: microseconds
                                                      expr    min
                                                       for 8253.1
         Dataset$diff_diff <- append(NA, diff(Dataset$V1))   14.5
 Dataset$diff_dplyr <- Dataset$V1 - dplyr::lag(Dataset$V1)   43.4
      lq     mean median      uq     max neval cld
 8685.20 9633.174 8967.1 9605.00 17018.9   100   b
   18.35   41.969   27.6   36.30  1384.7   100  a 
   59.75   94.788   99.4  115.45   230.7   100  a 

短いコマンドはどちらでもいいですが、変数にする方が見やすいとは思います。