.NETが使用するJITコンパイルプロセスは、つねに2つのコンパイル目標であるアプリケーション起動時間を早くすることとアプリケーションの定常状態でのパフォーマンスをよくすることのバランスを取らねばならなかった。エンドユーザの観点から、開始時にJITが定常状態のパフォーマンスがもっともよくなるよう停止をすると、アプリケーション起動速度が遅いと認知される影響がある。一方、JITがより早くアプリケーションを起動しようとすると、アプリケーションの定常状態でのパフォーマンスは二の次となってしまう。
この対立を解決する取り組みで、マイクロソフトのNoah Falk氏が.NET Core 2.1での階層型コンパイルの提供を発表した。これでJITは多様なコンパイルができるようになり、パフォーマンス全体をもっともよくする効果を考え実行時にホットスワップできるコードを生成することができる。最終的にアプリケーションの起動は早く、そして定常状態でのパフォーマンスもよいという結果になる。
この機能はまだプレビュー状態のためデフォルトでは有効ではないが、.NET Core 2.1アプリケーションであれば有効にする方法がいくつかある。コンパイルできるアプリケーションなら、単純にMSBuildのプロパティ<TieredCompilation>true</TieredCompilation>
をプロジェクトのデフォルトプロパティグループに追加するだけだ。
すでにコンパイルされたアプリケーションを実行していてソースを持っていないのなら、runtimeconfig.json
ファイルのconfigPropertiesセクションに新しいプロパティSystem.Runtime.TieredCompilation=true
を設定する。
あとは、環境変数COMPlus_TieredCompilation=1
を使いファイルを変更せずに階層型コンパイルを有効にすることもできる。
現時点では依然として.NET Core特有の機能で、.NET Frameworkへの展開は予定されていないことに注意すべきである。この新しい技術に興味があり試してみたい開発者は、マイクロソフトがGitHub上に設けたJitBenchプロジェクトを見ながら結果を比較することもできる。
Rate this Article
- Editor Review
- Chief Editor Action