web-dev-qa-db-ja.com

Rでの測定機能実行時間

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
245
dns

これを行うもう1つの方法は、Sys.time()を使用することです。

start.time <- Sys.time()
...Relevent codes...
end.time <- Sys.time()
time.taken <- end.time - start.time
time.taken

上記の回答と比較して、最もエレガントな方法ではありませんが、確実に行う方法です。

223
Shreyes

組み込み関数system.time()がそれを行います。

system.time(result <- myfunction(with, arguments))のように使用してください

165
Andrie

Andrieが言ったように、system.time()はうまく動きます。短い関数のために、私はそれにreplicate()を入れるのを好みます:

system.time( replicate(10000, myfunction(with,arguments) ) )
55
Sacha Epskamp

実行時間を測定するもう少し良い方法は、 rbenchmark パッケージを使うことです。このパッケージは(簡単に)あなたのテストを何回複製するかを指定することを可能にし、そして相対的なベンチマークがあるべきです。

stats.stackexchange にある関連質問も参照してください。

36
csgillespie

proc.time()もあります

Sys.timeと同じ方法で使用できますが、system.timeと同様の結果が得られます。

ptm <- proc.time()
#your function here
proc.time() - ptm

使用の主な違い

system.time({ #your function here })

proc.time()メソッドは単に時間を計測する代わりにあなたの関数を実行するということです…そしてところで私はsystem.timeを内側に入れて{}を使うのが好きです。

29

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です。

24
Davor Josipovic

パッケージ "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
22
Anton

他の解決策は単一の関数には役立ちますが、より一般的で効果的な次のコードをお勧めします。

Rprof ( tf <- "log.log",  memory.profiling = TRUE )
your code must be in between
Rprof ( NULL ) ; print ( summaryRprof ( tf )  )
15
TPArrow

必要に応じて、MATLABスタイルのtic-toc関数を使用できます。この他のSO質問を参照してください。

Rのストップウォッチ機能

11
Richie Cotton

これを行うための別の単純だが非常に強力な方法は、パッケージprofvisを使用することです。コードの実行時間を測定するだけでなく、実行する各機能についてドリルダウンすることもできます。 Shinyにも使用できます。

library(profvis)

profvis({
  #your code here
})

いくつかの例については、 ここ をクリックしてください。

9
gianni