関数の実行を繰り返すのにかかる時間を測定したいと思います。ある
replicate()
と同等のループに使用して?例えば:system.time(replicate(1000, f())); system.time(for(i in 1:1000){f()});
どちらが好ましい方法です。
の出力で
system.time()
はsys+user
、プログラムを実行するための実際のCPU時間ですか?あるelapsed
番組の時間性能の良い測定?
関数の実行を繰り返すのにかかる時間を測定したいと思います。あるreplicate()
と同等のループに使用して?例えば:
system.time(replicate(1000, f()));
system.time(for(i in 1:1000){f()});
どちらが好ましい方法です。
の出力でsystem.time()
はsys+user
、プログラムを実行するための実際のCPU時間ですか?あるelapsed
番組の時間性能の良い測定?
回答:
プログラムの効果的なタイミング、特に代替ソリューションの比較に関心がある場合、コントロールが必要です!良い方法は、計時しているプロシージャを関数に入れることです。タイミングループ内で関数を呼び出します。基本的に、関数からすべてのコードを取り除き、そこから戻るだけで、スタブプロシージャを記述します(ただし、すべての引数は残します)。スタブをタイミングループに入れてリタイムします。これは、タイミングに関連するすべてのオーバーヘッドを測定します。手順時間からスタブ時間を減算してネットを取得します。これは、実際に必要な時間の正確な測定値である必要があります。
最近のほとんどのシステムは、永久に中断される可能性があるため、複数のタイミングを実行して変動をチェックすることが重要です。秒の長い実行を1回実行する代わりに、それぞれ約N / m秒のm回の実行を実行します。これをダブルループで一度に実行すると便利です。処理が簡単であるだけでなく、各時系列に少し負の相関関係が導入され、実際に推定値が改善されます。
これらの実験的設計の基本原則を使用することにより、コードのデプロイ方法による違い(forループとreplicate()の違いなど)を本質的に制御できます。それはあなたの問題を解決します。
あなたの2つの点について:
replicate()
機能しているので気に入っています。elapsed
、3番目の数値に注目する傾向があります。私がよくやることは
N <- someNumber
mean(replicate( N, system.time( f(...) )[3], trimmed=0.05) )
呼び出しのN回の繰り返しの90%のトリム平均を取得しf()
ます。
(編集、思考をとってくれたHadleyに感謝します。)
mean(replicate(N, system.time(f(...))[3]), trim = 0.05)
?
によって返されるタイムステップで時間を計測することもできSys.time
ます。これはもちろんウォールタイムを測定するため、リアルタイムの計算時間です。サンプルコード:
Sys.time()->start;
replicate(N,doMeasuredComputation());
print(Sys.time()-start);
どのタイミングメトリックを使用するかについては、他のレスポンダーに追加できません。
使用する機能に関しては、rbenchmarkパッケージの?benchmarkを使用するのが好きです。