Rcpp使ってパフォーマンスを測ったらに分類される…?

こういうどうでもいい関数があったとする。

hoge <- function(x) {
  result = x + 1;
  for(i in 1:10000000){
    result <-  result + 1;
  }
  result
}

この関数の実行速度+パフォーマンスを測るにはRprof関数を使って以下のように書く。

> Rprof(tmp <- tempfile())
> a <- hoge(1:10)
> Rprof()
> summaryRprof(tmp)
$by.self
       self.time self.pct total.time total.pct
"hoge"      2.76    61.88       4.46    100.00
"+"         0.88    19.73       0.88     19.73
":"         0.82    18.39       0.82     18.39

$by.total
       total.time total.pct self.time self.pct
"hoge"       4.46    100.00      2.76    61.88
"+"          0.88     19.73      0.88    19.73
":"          0.82     18.39      0.82    18.39

$sample.interval
[1] 0.02

$sampling.time
[1] 4.46

んで、これが遅いなーと、計算のボトルネックだな―と思ってRcppを使って書きなおすと以下のようになる。

library(Rcpp)
sourceCpp(code='
  #include <Rcpp.h>
  using namespace Rcpp;
  
  // [[Rcpp::export]]
  NumericVector hoge(NumericVector x) {
    NumericVector result = x + 1;
    for(int i = 0; i < 10000000; i++){
      result = result + 1;
    }
    return result;
  }'
)

どうようにパフォーマンスを測ると

> Rprof(tmp <- tempfile())
> a <- hoge(1:10)
> Rprof()
> summaryRprof(tmp)
$by.self
              self.time self.pct total.time total.pct
"<Anonymous>"      0.14      100       0.14       100

$by.total
              total.time total.pct self.time self.pct
"<Anonymous>"       0.14       100      0.14      100
"hoge"              0.14       100      0.00        0

$sample.interval
[1] 0.02

$sampling.time
[1] 0.14

たしかに高速化されている。高速化されて速くなったのはいいんだけど、Anonymousって・・・C++を呼ぶ際の内部関数の名前なんだろうか。要調査。

追記

この辺と同じか。中で直に関数のポインタを呼んでるときは、Anonymous扱いされる模様。

Hadley、パフォーマンス計測用のパッケージ、複数作ってるっぽい。

最終コミットから察するにlineprofを伸ばしていくっぽい。そういえば昔試していた。

呼び出し関係を可視化するproftoolsなんてのもあるのか。