原則として、バイトコードがコンパイルおよびロードされると、少なくとも元のASTインタープリターと同じ速度で常に解釈される必要があります。一部のコードは大幅な高速化の恩恵を受けます。これは通常、多くのスカラー演算とループを備えたコードであり、ほとんどの時間がRの解釈に費やされます(10倍の高速化の例を見てきましたが、任意のマイクロベンチマークで必要に応じてこれを膨らませることができます)。一部のコードは同じ速度で実行されます。これは通常、適切にベクトル化されたコードであるため、解釈にほとんど時間を費やしません。現在、コンパイル自体が遅くなる可能性があります。したがって、ジャストインタイムコンパイラは、それが報われないと推測したときに関数をコンパイルしないようになりました(そして、ヒューリスティックは時間とともに変化します。これはすでに3.4.xにあります)。ヒューリスティックは常にそれを正しく推測するとは限らないため、コンパイルがうまくいかない場合があります。
パッケージはインストール時にバイトコンパイルできるため、少なくとも事前にわかっているコードの場合、実行時にコンパイルコストが(繰り返し)支払われることはありません。これは現在、Rの開発バージョンのデフォルトです。コンパイルされたコードのロードはコンパイルよりもはるかに高速ですが、状況によっては、実行されないコードでもロードされる場合があるため、実際にはオーバーヘッドが発生する可能性がありますが、全体として事前コンパイルは有益です。最近、GCの一部のパラメーターが調整され、実行されないコードのロードコストが削減されました。
パッケージ作成者への私の推奨事項は、デフォルトを使用することです(リリースされたバージョンでは、ジャストインタイムコンパイルがデフォルトでオンになり、開発バージョンでは、パッケージインストール時のバイトコンパイルがオンになります)。バイトコードコンパイラがうまく機能しない例を見つけた場合は、バグレポートを提出してください(rpart
以前のバージョンに関係するケースも見ました)。コード生成とコード操作、特にホットループではそうしないことをお勧めします。これには、クロージャの定義、クロージャによってキャプチャされた環境でのバインディングの削除と挿入が含まれます。絶対にすべきではありませんeval(parse(text=
ホットループで(そしてこれはバイトコンパイルなしですでに悪いことでした)。新しいクロージャー(ブランチなし)を動的に生成するよりも、ブランチを使用する方が常に優れています。また、(ループなしで)巨大な式を使用してコードを動的に生成するよりも、ループを使用してコードを作成する方が適切です。バイトコードコンパイラを使用すると、Rでスカラーを操作するループを記述できるようになります(パフォーマンスは以前ほど悪くないため、パフォーマンスが重要な部分をCに切り替えることなく回避できることが多くなります) 。