最近, .NET Nativeがプレビューで出始めたりと.NET界隈でもネイティブコードを簡単に扱う機構がそろい始めてきたので, 簡単にまとめてみます.
JIT
JITは, JIT(Just-In-Time)の略で, 実行時コンパイラを指します.
.NETは, 基本的にコンパイル時にILという中間言語にコンパイルされて配布されます.
そのILは, 実行時にCLIという共通言語基盤によってJITコンパイルされてネイティブコードに変換されてから実行されます.
そのため, .NETで記述されたアプリケーションを通常の手順で実行するとC/C++のようにネイティブコードに直接変換されているアプリケーションと比べて実行が遅くなります.
また, Xamarinの場合では, Android版がこの方式で動作するのでMonoVM上でJIT実行されます.
ちなみに, 通常Androidで使われるDalvikVMよりもMonoVMの方がアプリケーションの動作速度などで性能が高く, 実行がDalvikVMに劣る以外では基本的に MonoVMで動作させた方が軽快に動くようです.
AOT
AOTは, AOT(Ahead-Of-Time)の略で, 事前コンパイラを指します.
JITと違い, 配布時に予めネイティブコードに変換されるため, JITの問題でもある実行時に時間がかかるといった問題が解消されます.
また, AOTは, ほぼすべてが静的リンクされるため動的言語の場合実現が難しい問題があります.
Xamarin.iOSや, .NET Nativeはこの方式を使用しています.
Xamarinの場合は, 上記の弱点の通りジェネリック型に制限があったりとC#の機能をフルに生かせない弱点があります.
Monoには, 元々AOTコンパイル機能が組み込まれているため, Xamarin.iOSでは, この機能を使用してコンパイルしています.
まとめ
AOTとJITそれぞれには, 一長一短あります.
特に最近のC#のように動的なコードが連発するとAOTの場合コンパイルエラーにはならないのに実行すると動かないといったことも十分にあり得るため, 使いどころを考えて慎重に扱うべきではないかと思います.