読者です 読者をやめる 読者になる 読者になる

いろいろ備忘録日記

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

on the flyでpre-JITを実行する (CodeProject, RuntimeHelpers, PrepareMethod, JIT, Just In Time)


CodeProjectに興味がそそられる記事があったのでメモメモ。


以下のクラスのメソッドを利用することでpre-JITが行えるみたいです。

System.Runtime.CompilerServices.RuntimeHelpers.PrepareMethod


こんな名前空間気にした事もなかったw
実際に使う場合は、CodeProjectの記事にもあるように、専用のスレッドを
低プライオリティで立ててその中で実行するのが普通ですね。

using System.Runtime.CompilerServices;

// Pre-JITを行うスレッド作成.
Thread jitter = new Thread(() =>
{
  var flags = (BindingFlags.DeclaredOnly | BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static);

  foreach (var type in heavyAsm.GetTypes())
  {    
    foreach (var method in type.GetMethods(flags))
    {
      RuntimeHelpers.PrepareMethod(method.MethodHandle);
    }
  }
});

// メソッドの優先度を最低に設定して実行.
jitter.Priority = ThreadPriority.Lowest;
jitter.Start();