私はこの答えを高くも低くも見てきたので、ここに投稿することにしました。Linux C ++プログラムでRCppのようなRスクリプト/関数を呼び出す場合、顕著な遅延が予想されますか?これは予想されるのでしょうか、それとも合理的に聞こえるでしょうか?Java JARファイルのRCallerのようなものを使用するとどうなりますか?同じRスクリプト/関数を呼び出している場合、C ++はJavaよりも高速だと思いますか?予想される違いはありますか?ありがとう
2 に答える
RをC++アプリケーションに非常に簡単に埋め込むことができるRInsideが必要だと思います。Qt、Wt(webapps用)およびMPIで使用するものを含め、4つのディレクトリに多数の例が付属しています。
そのフレームワークでは、起動時にRを一度インスタンス化してから、独自のインスタンスを作成します。ラウンドトリップレイテンシーは、コマンドをRインスタンスに送信するのにかかる時間に加えて、Rにかかる時間(これが支配的である可能性があります)とリターンになります。
RInsideはRcppを使用するため、オブジェクト全体の転送とその他すべての機能を利用できます。RInsideの例を見て、rcpp-develリストに質問を投稿してください。
私はR外部関数インターフェースまたはRCppについて特別な知識はありませんが、他の多くの人と協力してきました。あなたの質問に確実に答えることはできません。経験則はいくつかあります。FFIの役割は、呼び出し側環境と呼び出された環境の両方の前提を満たすことです。これは通常、一方から他方にコピーすることにより、両方の言語のデータレイアウトを一致させることに関するものです。(これがRCppのすべてです。)または、非常に幸運で、それらを一致させることができます。ランタイム環境が類似している場合、または言語間の境界を越えて移動されるデータが小さい場合、これは非常に効率的です。自己関数呼び出しよりもはるかにコストがかかりません。このため、FortranからCを呼び出すのは非常に高速です。環境が大きく異なる場合は、大きなデータ構造をコピーする必要があります。コピーはリソースを消費します:メモリとプロセッサのサイクル。ガベージコレクションは、環境間の違いのポスターの子です。別々のコレクターが協力することはめったにありません(決して読まない)。RとJava(両方ともガベージコレクション)は、おそらくこの理由でコピーする必要があります。特にcalLRにC++を記述している場合は、コピーが不要になるようにRCpp構造でデータを設定できる場合があります。
インターフェイスを介して移動する必要のあるデータの量を模倣する、C++で始まるいくつかの小さなテストを作成します。それらを実行して時間を計り、オーバーヘッドコストを取得します。これから、実際の決定を下すことができます。