7

私は R で Gibbs サンプラーを書き、それを C に移植して高速になるかどうかを確認することにしました。私が見た多くのページでは、C は最大で 50 倍高速になると主張していますが、私が C を使用するたびに、R よりも約 5 倍または 6 倍高速になるだけです。 Cコードをこれよりも大幅に高速化する、使用していないトリックはありますか(ベクトル化を使用してRでコードを高速化する方法など)? 私は基本的にこのコードを C で書き直して、行列演算を for ループに置き換え、すべての変数をポインターにしました。

また、R プログラマーの観点から見た C の優れたリソースを知っている人はいますか? Matloff によるThe Art of R Programmingという優れた本がありますが、C を既に知っている人の視点から書かれているようです。

また、C コードを標準の R GUI for Windows で実行すると、画面がフリーズする傾向があります。クラッシュしません。コードの実行が完了するとフリーズが解除されますが、GUI で他の操作を行うことができなくなります。これを回避する方法を知っている人はいますか?.C() を使用して関数を呼び出しています

4

4 に答える 4

15

既存の投稿の多くには、実行できる明示的な例が含まれています。たとえば、Darren Wilkinson はブログで、これをさまざまな言語で分析したり、後でさまざまなハードウェアで分析したりしています (たとえば、彼のハイエンド ラップトップを彼のネットブックや Raspberry Pi と比較するなど)。 )。彼の投稿のいくつかは

彼のサイトには他にもたくさんあります - これらはしばしば C、Java、Python などを比較します。

さて、これもRcppを使用したバージョンに変えました- このブログ投稿を参照してください。また、この夏の useR での Julia、Python、R/C++ の比較でも同じ例を使用したので、他の例や参考文献がたくさんあるはずです。MCMC は広く使用されており、高速化のための「簡単な選択」です。

これらの例を踏まえて、あなたの質問が受け取った前の 2 つのコメントに同意できないことを付け加えさせてください。速度は同じではありません。このような例では簡単に改善できます。C/C++ のスキルによって、どの程度改善されるかが決まります。

最後に、見過ごされがちな側面は、RNG の速度が非常に重要であるということです。ループを実行して物事を追加するのは安上がりですが、「良い」ドローを行うのはそうではなく、システム間の多くの変動もそこから生じます。

于 2012-11-15T01:38:59.240 に答える
2

GUIのフリーズについては、たまに電話をかけたいと思うかもしれませR_CheckUserInterruptR_ProcessEvents

于 2012-11-15T11:17:37.027 に答える
2

適切に実行された C は R よりもはるかに高速であると言えます。

あなたが試すことができるいくつかの簡単な利点: より高速に最適化するようにコンパイラを設定します。-march フラグを指定してコンパイルします。また、VS を使用している場合は、デバッグではなく、リリース オプションを使用してコンパイルしていることを確認してください。

于 2016-10-12T17:11:01.977 に答える
1

観察されるパフォーマンスの違いは、実行している操作の種類、C コードの記述方法、使用するコンパイラ レベルの最適化の種類、ターゲットの CPU アーキテクチャなど、さまざまな要因によって異なります。

基本的でずさんな C を書いて、適切な効率で機能し実行するものを手に入れることができます。また、ターゲット CPU の固有の特性に合わせてコードを微調整し (おそらく特殊なアセンブリ命令を呼び出して)、コードから可能なパフォーマンスの最後の一滴まで絞り出すこともできます。R バージョンよりも実行速度が大幅に遅いコードを作成することもできます。C には多くの柔軟性があります。ここでの制限要因は、C コードの作成と最適化に費やす時間です。

逆もまた真です (ここで前の段落を複製しますが、"C" と "R" を入れ替えます)。

おかしなことを言っているわけではありませんが、あなたの質問に対する直接的な答えはありません。C バージョンがどれだけ高速になるかを知る唯一の方法は、両方の方法でコードを記述し、それらをベンチマークすることです。

于 2012-11-15T01:59:08.643 に答える