Rでの関数実行時間の測定


282

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

2
あなたが考えていproc.timeた原因system.timeはあなたが必要としているものだと思います。
Marek

1
大きな関数の場合Rprofは、いいです。コードチャンク/関数内のすべてのプロセスのプロファイルを提供します。
Rich Scriven 2014

38
google:を介してこの質問を見つけた新しいRユーザーrequire(microbenchmark)は、(数年前から)コミュニティ標準の方法です。times <- microbenchmark( lm(y~x), glm(y~x), times=1e3); example(microbenchmark)。これはありません、統計の比較lmglmのではなく、1000以上の試行をsystem.time一度だけテストします。
同型写像

使用res <- microbenchmark(your code1,your code2)して、print(res)表を参照するか、ggplot2::autoplot(res)箱ひげ図を参照してください!ref
Travis

回答:


253

これを行う別の可能な方法は、Sys.time()を使用することです。

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

上記のアンサーと比較して、最もエレガントな方法ではありませんが、間違いなくそれを行う方法です。


14
これは、効果的に引数をコピーするsystem.time()よりもはるかにメモリ効率が良いです。RAMにほとんど収まらないデータを扱う場合は重要です。
Adam Ryczkowski、2015

2
を使用する人はSys.time、注意してこれを読んでください。Sys.time()
李哲源

1
system.time()私にとっては速かった。の答えはsystem.time()受け入れられるべきだと思います!
Gwang-Jin Kim

これは、複数のコアで並列に実行される長い計算にかかる時間を知るための私の好ましい方法です。この場合、この呼び出しで測定された実時間は十分正確です。これは、コンピューターがすべてのコアを計算して他の何よりもずっとビジーになるため、計算が完了するまでに数分または数時間かかるためです。これは非常に特殊なユースケースですが、言及する価値があります。
パブロアダメス

186

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

次のように使用: system.time(result <- myfunction(with, arguments))


1
知っておくべき重要なことは、デフォルトでsystem.time()ある引数gcFirstを持っているというTRUEことです。これにより、一方では測定の再現性が少し向上しますが、合計実行時間の大きなオーバーヘッドが発生する可能性があります(これはもちろん、測定されていません)。
jakob-r

2
これはどの単位で測定されますか?例えば私は走ったsystem.time(result <- myfunction(with, arguments))して187.564を出力として取得しました-それは数秒ですか?
zsad512 2017


@ zsad512私はそれらが秒であることを合理的に確信しています。
タッパー

58

アンドリーが言ったように、system.time()うまく働きます。短い関数のためにreplicate()、私はそれを入れることを好みます:

system.time( replicate(10000, myfunction(with,arguments) ) )

28
タイミングに複製のオーバーヘッドが含まれていないため、microbenchmarkパッケージを使用する方が良いでしょう。
ハドリー、2011年

37

実行時間を測定するもう少し良い方法は、rbenchmarkを使用することですパッケージ。このパッケージを使用すると、(簡単に)テストを複製する回数を指定でき、相対ベンチマークが必要になります。

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


6
マイクロベンチマークは、より高精度のタイミング関数を使用するため、さらに優れています。
ハドリー、2011年

4
@hadleyしかし、比較の場合、rbenchmarkはよりユーザーフレンドリーです。私にとってマイクロベンチマークはアップグレードされたsystem.timeです。rmicrobenchmarkは私たちに必要なものです:)
Marek

3
マイクロベンチマークのメンテナーは非常に敏感です-必要なものは何でも追加すると思います。
ハドリー

34

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〜30 nsでした。


32

もあります proc.time()

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

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

使用の主な違い

system.time({ #your function here })

proc.time()時間を測定するだけでなく、メソッドが関数を実行することです...ところで、私system.time{}内部で使用したいので、一連のものを置くことができます...


25

「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

18

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

Rprof(tf <- "log.log", memory.profiling = TRUE)
# the code you want to profile must be in between
Rprof (NULL) ; print(summaryRprof(tf))

2
今までRprofについて知りませんでした。さらに、ベースRが付属しているため、microbenchmarkまたはのような追加パッケージは必要ありませんprofvis
Simon C.

たとえば、プロファイリングする各項目の時間をプロットしたい場合など、rprofも視覚化できるのでしょうか。
Zawir Amin

@ZawirAmin方法があります。Rstudio>>プロファイルメニューを使用してください
TPArrow

13

これを行うもう1つの単純ですが非常に強力な方法は、パッケージを使用することprofvisです。これは、コードの実行時間を測定するだけでなく、実行する各関数のドリルダウンを提供します。シャイニーにも使用できます。

library(profvis)

profvis({
  #your code here
})

クリックしてここにいくつかの例のために。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.