1

Rprof タイプの関数を使用して R コードをプロファイリングすると、関数だけで費やされた時間と、関数と呼び出し先で費やされた時間が得られます。ただし、私が知る限り、特定の関数が評価された回数はわかりません。

たとえば、2 つの積分関数を比較したいとします。

integrate_1(myfunc, from = -Inf, to = Inf)
integrate_2(myfunc, from = -Inf, to Inf)

各関数にかかる時間と、この時間が費やされた場所を簡単に確認できましたが、各統合関数で myfunc を評価する必要があった回数を確認する方法がわかりません。

ありがとう、

4

2 に答える 2

1

Joran のカウンター メソッドを実装する 1 つの方法は、trace関数を使用することです。

たとえば、最初にカウンターをゼロに設定します。(便宜上、グローバル環境で割り当てられます。)

count <- 0

次にトレースを設定します。ここでは、identity関数に設定します (入力した値を返すだけです)。

trace("identity", quote(count <<- count + 1), print = FALSE)

が呼び出されるたびidentityに、 の値countがインクリメントされます。 print = FALSE関数が呼び出されたときにコンソールに出力されるメッセージを停止するだけです。

関数を数回呼び出して、カウントを調べてみましょう。

for(i in seq_len(123)) identity(1)
count
## [1] 123
于 2013-09-27T15:12:15.940 に答える
0

Rprofタイマーでコールスタックをサンプリングすることで機能します。通話はカウントされません。

サンプリングされたコール スタックをファイルに記録します。コールが発生した行番号は記録されませんが、これらのサンプルは、時間がかかる原因を確認するのに役立ちます。

たとえば、たまたま M 個のランダム サンプルを見て、A が B を呼び出して B を呼び出し、そのうちの N 個で C を呼び出すようなパターンが見られた場合、プログラムがそれを行うのに時間のおよそ N/M の割合を費やしていることがわかります (N > 1 と仮定します)。 )。そのようなことを見て、その一部でも回避する方法を考えることができれば、合計時間のかなりの部分を節約できます。

Rprofあなたが言及した種類の数値を提供する要約ツールが付属していますが、とにかくそれらの数値は役に立ちません。むしろ何が起こっているのかをリアルに感じたいと思います。

于 2013-09-27T19:28:04.380 に答える