いろいろ備忘録日記

主に .NET とか Go とか Flutter とか Python絡みのメモを公開しています。

マルチコアJITを有効にする (Multicore JIT, .NET 4.5, System.Runtime.ProfileOptimization, パフォーマンス向上)


以下、自分用のメモです。
.NET 4.5より、マルチコアJIT (Multicore JIT)という機能が追加されました。
文字通り、マルチコアな環境で並列してJITを動作させるという機能です。


これにより、アプリケーションのメインの処理に先行して、必要となるメソッドのJIT
済ませておくことができるということになります。上記URLの内容を読むと
bing.comでマルチコアJITに変えただけで大幅にパフォーマンスが上がったとのことです。


このマルチコアJIT機能は、ASP.NET 4.5 と Silverlight5 では
デフォルトで有効となっています。逆にデスクトップアプリケーションのほうでは
デフォルトで有効となっておらず、開発者側で手動で有効にする必要があります。
デスクトップ側で有効となっていないのは、この機能を利用する場合、プロファイリングが
必要であり、かつ、プロファイルデータを保存しておくことが必須条件だからです。


ごちゃごちゃと記述してしまいましたが、利用方法はいたって簡単です。
以下の2つのメソッドを呼び出すだけです。

ProfileOptimization.SetProfileRoot(string)
ProfileOptimization.StartProfile(string)


ProfileOptimizationクラスは、Systme.Runtime名前空間に存在します。
SetProfileRootメソッドには、プロファイルデータを格納する場所を指定します。
StartProfileメソッドには、プロファイルデータが設定されるファイル名を指定します。


以下、呼び出し部分だけのサンプルです。(メモがわり)

#region MulticoreJITSamples-01
  public class MulticoreJITSamples01 : IExecutable
  {
    public void Execute()
    {
      //
      // .NET 4.5よりマルチコアJITが搭載されている.
      // 文字通り、マルチコア構成の環境にて並列でJITを行う機能である。
      // これにより、アプリケーションの動きに先行して、必要となるメソッドのJITが
      // 行われる可能性が高くなり、結果的にアプリケーションのパフォーマンスが上がるとのこと。
      //
      // マルチコアJITは、ASP.NET 4.5とSilverlight5では
      // 既定で有効となっているが、デスクトップアプリケーションでは
      // デフォルトで有効になっていない。
      //
      // 有効になっていない理由は、この機能を利用するためには
      // プロファイリング処理が必須であり、プロファイルデータを保存
      // することが条件であるため。デスクトップアプリケーションでは
      // フレームワーク側が、プロファイルデータをどこに保存するべきなのかを
      // 判断できないため、手動で実行するようになっている。
      //
      // 参考URL:
      //  http://blogs.msdn.com/b/dotnet/archive/2012/10/18/an-easy-solution-for-improving-app-launch-performance.aspx
      //  http://stackoverflow.com/questions/12965606/why-is-multicore-jit-not-on-by-default-in-net-4-5
      //  http://msdn.microsoft.com/ja-jp/magazine/hh882452.aspx
      //
      // マルチコアJITを有効にするには、System.Runtime.ProfileOptimizationクラスの
      // 以下のstaticメソッドを呼び出すだけである。
      //   ・SetProfileRoot
      //   ・StartProfile
      // 上記メソッドは、アプリケーションのエントリポイントで呼び出す方がよい。
      //
      
      //
      // マルチコアJITを有効にする.
      //  プロファイルデータ格納場所は、アプリ実行フォルダ.
      //  プロファイルデータのファイル名は、App.JIT.Profileとする。
      //
      ProfileOptimization.SetProfileRoot(Environment.CurrentDirectory);
      ProfileOptimization.StartProfile("App.JIT.Profile");
    }
  }
  #endregion


自分の環境 (4プロセッサ)で試しに、DevExpressの大きめのサンプルに
マルチコアJITを行うよう設定して実行したところ、少し起動速度や動作が速くなったかなと
感じました。やっぱり、サンプル程度のアプリでは効果はなかなかわかりませんね。
実業務レベルのアプリケーションだと、目に見えて効果が現れるかもしれません。


ただ、マルチコアJITを行っているバージョンの方が、起動時にCPU使用率が高くなりました。
4コアフルに使っている感触です。やり方もめっちゃ簡単なので、とりあえずアプリのエントリポイントで
プロファイルするよう実行しておいてもいいかもしれませんね。


================================
過去の記事については、以下のページからご参照下さい。

サンプルコードは、以下の場所で公開しています。