適応的コンパイル (Adaptive Compilation)
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2021/05/12 15:53 UTC 版)
「実行時コンパイラ」の記事における「適応的コンパイル (Adaptive Compilation)」の解説
上のようなJITコンパイラの短所を補うためのJITコンパイルの一方式として適応的コンパイルという方式がある。これは、起動当初はインタプリタとして実行し、よく呼び出されるメソッドや繰り返し実行されるコードの検出(プロファイリング)を行い、そのようなコードのみをコンパイルする、というものである。このとき、コードが使われた時にすぐにコンパイルするのではなく、何回か呼ばれた後に遅らせてコンパイルを行うが、このことを遅延コンパイル (Lazy Compilation)と呼ぶ。一般にプログラムの実行においてその実行時間の大半はプログラム中のごく一部において費やされる、という経験則がある(実際の比率については状況に依存するが、典型的にはコードの実行時間の80%は20%のコードにおいて費やされるといわれ、80-20の法則と呼ばれる)。それと似て、適応的コンパイルにおいては実行時間の大半が費やされるような、ボトルネックとなるコードのみをコンパイルすることで、起動時のオーバーヘッドや利用メモリ増大を抑えたうえで、効率よく実行速度を向上することができる。この適応的コンパイルによる適応的最適化 (Adaptive Optimization) は、静的コンパイルでは得られない情報をも元にして最適化が行えるため、静的コンパイルより、むしろパフォーマンスが上がる場合もある。 注意すべきは、企業のバッチ処理である。数百件以内といった少量レコードを処理するバッチジョブが、一日に何百本、何千本も走る企業が多い。そういう場では、JITコンパイルを用いた場合、適応的コンパイルをしてさえも、ジョブの走り初めに、使われるユーザクラスさらにはコアクラスと呼ばれるような共通的なクラスのコンパイル処理がロード処理を伴いのべ何百回と行われる。処理件数が少ないので、使うクラス群の多くはコンパイル効果が出る前に、あるいはコンパイルさえされないうちにジョブ実行が終わってしまう。その結果、正味のユーザロジックよりこうした「オーバヘッド」の方が大きな比率を占める。CPUなどの資源が、いつも同様のプログラム群のコンパイルに消費されてしまい、待ちが生じて多重効果の妨げにもなる。処理件数によってJIT/AOTの有利不利が変わるが使い分ける仕組みは非常に作りにくい。また、(Javaについていえば)AOTコンパイラを通常適用しにくい。[独自研究?]これらの理由で、性能面ではマイナスな場面でも一般的な[独自研究?]JITコンパイラを使用していることがある。 長時間バッチジョブおよびオンラインでは、JITコンパイラ、特に適応的コンパイルが概してフィットしている。[独自研究?] 適応的コンパイルの最適化のために、何回実行されたらコンパイルするか、といったパラメタが用意されているコンパイラがある[要出典]。パラメタチューニングは万能ではないとしても重要である。[独自研究?]
※この「適応的コンパイル (Adaptive Compilation)」の解説は、「実行時コンパイラ」の解説の一部です。
「適応的コンパイル (Adaptive Compilation)」を含む「実行時コンパイラ」の記事については、「実行時コンパイラ」の概要を参照ください。
- 適応的コンパイルのページへのリンク