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扱いされる模様。
- Digging into R profiling information - Stack Overflow
- [R] Naming functions for the purpose of profiling
Hadley、パフォーマンス計測用のパッケージ、複数作ってるっぽい。
- GitHub - hadley/lineprof: Visualise line profiling results in R
- GitHub - hadley/profr: An alternative profiling package for R
最終コミットから察するにlineprofを伸ばしていくっぽい。そういえば昔試していた。
呼び出し関係を可視化するproftoolsなんてのもあるのか。