2017-05-02 7 views
14

system.timeを使用してコードを実行するために使用された時間を記録することができます。ここで少し例を示します。Rの算術演算の回数をカウントすることはできますか?

system.time(
    mean(rnorm(10^6)) 
) 

しかし、私は(つまり+、 - であり、*、/)時間内だけでなく、演算回数で唯一興味がないコードのために使用されました。

上記の場合、平均を得るために集計の数と除算を数えやすくなりますが、これを適用するコードははるかに複雑です。

私の質問です:算術演算の数を数える関数がありますか?

+4

Rレベルまたはコンパイルレベル(Fortran、C/C++)では? – Roland

+0

コメントありがとうございます!個人的には、私はFortranとCに精通していないので、Rレベルを好むでしょう。しかし、あなたのソリューションを分かち合うことができれば、おそらく他の人にとってはうれしいでしょう。 – ehi

答えて

25

あなたは興味のRの機能をトレースすることができます

counter <- 0 

trace("+", at = 1, print = FALSE, 
     tracer = quote(.GlobalEnv$counter <- .GlobalEnv$counter + 1)) 
#Tracing function "+" in package "base" 
#[1] "+" 

Reduce("+", 1:10) 
#[1] 55 

counter 
#[1] 9 

untrace("+") 
#Untracing function "+" in package "base" 

私はそれがRレベルがここに呼び出しをカウントすることがいかに便利かわかりません。多くの(ほとんどの)関数は、CやFortranコード、さらにはBLASでも算術演算を行います。コンパイルされたコードで呼び出しをカウントするソリューションはありません。コンパイルが可能な場合は、コンパイル時にそれを設定する必要があります。

+0

ありがとうございました!線形モデルなどにも使用できますか?例えば、 'lm(mpg〜disp、data = mtcars)'の算術演算を数えるには? – ehi

+0

私の答えの最後の段落は 'lm'に適用されます。 – Roland

関連する問題