Rに関数の実行時間を測定する標準的な方法はありますか?
明らかに、実行の前後にsystem.time
を取り、そしてそれらの違いを取ることができますが、標準化された方法や機能があるかどうかを知りたいのです(ホイールを発明したくない)。
私はかつて以下のようなものを使ったことがあるのを覚えているようです。
somesysfunction("myfunction(with,arguments)")
> Start time : 2001-01-01 00:00:00 # output of somesysfunction
> "Result" "of" "myfunction" # output of myfunction
> End time : 2001-01-01 00:00:10 # output of somesysfunction
> Total Execution time : 10 seconds # output of somesysfunction
これを行うもう1つの方法は、Sys.time()を使用することです。
start.time <- Sys.time()
...Relevent codes...
end.time <- Sys.time()
time.taken <- end.time - start.time
time.taken
上記の回答と比較して、最もエレガントな方法ではありませんが、確実に行う方法です。
組み込み関数system.time()
がそれを行います。
system.time(result <- myfunction(with, arguments))
のように使用してください
Andrieが言ったように、system.time()
はうまく動きます。短い関数のために、私はそれにreplicate()
を入れるのを好みます:
system.time( replicate(10000, myfunction(with,arguments) ) )
実行時間を測定するもう少し良い方法は、 rbenchmark パッケージを使うことです。このパッケージは(簡単に)あなたのテストを何回複製するかを指定することを可能にし、そして相対的なベンチマークがあるべきです。
stats.stackexchange にある関連質問も参照してください。
proc.time()
もあります
Sys.time
と同じ方法で使用できますが、system.time
と同様の結果が得られます。
ptm <- proc.time()
#your function here
proc.time() - ptm
使用の主な違い
system.time({ #your function here })
proc.time()
メソッドは単に時間を計測する代わりにあなたの関数を実行するということです…そしてところで私はsystem.time
を内側に入れて{}
を使うのが好きです。
microbenchmark
は軽量(〜50kB)のパッケージで、多かれ少なかれRで複数の式や関数をベンチマークするための標準的な方法です:
microbenchmark(myfunction(with,arguments))
例えば:
> microbenchmark::microbenchmark(log10(5), log(5)/log(10), times = 10000)
Unit: nanoseconds
expr min lq mean median uq max neval cld
log10(5) 0 0 25.5738 0 1 10265 10000 a
log(5)/log(10) 0 0 28.1838 0 1 10265 10000
ここでは両方の式が10000回評価され、平均実行時間は約25〜30nsです。
パッケージ "tictoc"はあなたに実行時間を測定する非常に簡単な方法を与えます。ドキュメントは次の場所にあります。 https://cran.fhcrc.org/web/packages/tictoc/tictoc.pdf 。
install.packages("tictoc")
require(tictoc)
tic()
rnorm(1000,0,1)
toc()
経過時間を変数に保存するには、次のようにします。
install.packages("tictoc")
require(tictoc)
tic()
rnorm(1000,0,1)
exectime <- toc()
exectime <- exectime$toc - exectime$tic
他の解決策は単一の関数には役立ちますが、より一般的で効果的な次のコードをお勧めします。
Rprof ( tf <- "log.log", memory.profiling = TRUE )
your code must be in between
Rprof ( NULL ) ; print ( summaryRprof ( tf ) )
必要に応じて、MATLABスタイルのtic
-toc
関数を使用できます。この他のSO質問を参照してください。
これを行うための別の単純だが非常に強力な方法は、パッケージprofvis
を使用することです。コードの実行時間を測定するだけでなく、実行する各機能についてドリルダウンすることもできます。 Shinyにも使用できます。
library(profvis)
profvis({
#your code here
})
いくつかの例については、 ここ をクリックしてください。