私はMatlabからRに移植したコードをいくつか持っていますが、その性能を比較したいと思います。Rコード実行:システム時刻()
ただし、問題が発生しました。system.time()
をRで使用していますが、同じコードに対して異なる結果が表示されます。これは起こるはずですか?どのように私はそれを比較するのですか?
私はMatlabからRに移植したコードをいくつか持っていますが、その性能を比較したいと思います。Rコード実行:システム時刻()
ただし、問題が発生しました。system.time()
をRで使用していますが、同じコードに対して異なる結果が表示されます。これは起こるはずですか?どのように私はそれを比較するのですか?
自分の100mスプリントを走らせる時間があれば、違う結果になるでしょう!コンピュータには、コードを実行するのにかかる時間が多少異なるものがたくさんあります。
解決策は、コードを何度も実行することです。 Rパッケージbenchmark
はあなたが探しているものです。
ありがとう! ;)私はそれがこの状況かもしれないと思っていたが、私のネットワークでは誰もRを知っていないので、数字を説明することはできない! –
@ジャスティンは言ったように、時は常に変化します。特にガベージコレクションシステムがあなたの特定の用途に適合していないため、初めてのカップルです。測定前にRを再起動して、他のプログラムを終了して、システムが現在ウイルスをスキャンしていないことを確認することをお勧めします...
測定時間が小さい場合(a秒)、相対誤差はかなり大きいので、少なくとも1秒かかるように問題を調整してください。
パッケージbenchmark
またはrbenchmark
が役立ちます。
...しかし、私は通常、問題を回避するためにfor-loopを実行し、2秒ほどかかるまで調整します。その後、何回も実行します。ここで
は例です:
f <- function(x, y) {
sum <- 1
for (i in seq_along(x)) sum <- x[[i]] + y[[i]] * sum
sum
}
n <- 10000
x <- 1:n + 0.5
y <- -1:-n + 0.5
system.time(f(x,y)) # 0.02-0.03 secs
system.time(for(i in 1:100) f(x,y)) # 1.56-1.59 secs
...ので、100回は相対誤差をたくさん減少し、それを呼び出します。
使用された時間は、処理時間のオペレーティングシステムのカウンタです。これらはサンプリングされた値であり、通常はかなり正確です。しかし、「間違った」周波数のタイマー(OS依存、OpenVms AXPの場合は10msの倍数)によって駆動される競合するプロセスがあると、それらは非常に間違った結果を生む可能性があります。 –
ありがとうございます!それは私が理解するのに役立ちます! –
あなたの質問に直接関係はありませんが、R対Matlabを比較するだけではなく、両方の言語を最大限に活用するコードを書く能力を比較していることにも留意してください。 – joran
ありがとうジョラン!感謝します! –