- PR -

.NETはインタプリタじゃない?

投稿者投稿内容
小野@どっとねっとふぁん
ぬし
会議室デビュー日: 2001/10/30
投稿数: 402
投稿日時: 2002-03-20 13:33
引用:
-----------------------------------------------------------------------

>> 初めての実行時にJITでネイティブコードを生成させ、
> これは初耳です。どこかにリファレンスがありますか?

-----------------------------------------------------------------------

.NET Framework SDKの日本語版のドキュメントにありますね。

.NET Framework SDK
 .NET Framework の内容
  共通言語ランタイム
   マネージ実行プロセス
    MSIL からネイティブ コードへのコンパイル

ここに実行時のコンパイルについての詳しい話がでています。
一部抜粋すると、
---------
メソッドが初めて呼び出されると、スタブは JIT コンパイラに制御を渡し、
JIT コンパイラがそのメソッドの MSIL をネイティブ コードに変換し、
そのネイティブ コードを直接実行するようにスタブを変更します。
それ以降は、この JIT コンパイル済みのメソッドを呼び出すと生成済みの
ネイティブ コードが直接実行され、JIT コンパイルとコードの実行に
必要な時間を節約できます。
---------
となるようです。

NothingBut.NETFX
大ベテラン
会議室デビュー日: 2001/09/13
投稿数: 102
投稿日時: 2002-03-20 14:47
いや、それって、
引用:

私:
一方、CLRはコードをメソッド単位でコンパイルします。メソッドが呼ばれたらコンパイルし、次からはコンパイル済みのものを使うようにします。


のことですよね?あ、それとも最初からそのことだったのかな?私の勘違いでしたか。

アプリが始めて実行されるときに、ngenと同じことをしてくれる機能があるっていう意味だと思ってました。

[ メッセージ編集済み 編集者: NothingBut.NETFX 編集日時 2002-03-20 14:49 ]
object
ぬし
会議室デビュー日: 2002/03/20
投稿数: 338
お住まい・勤務地: 香川県高松市
投稿日時: 2002-03-20 18:00
私も余り詳しくは無いのですが、問題になっているのは、pre-JITの事だと思います。

pre-JITでは、インストール時にネイティブコードへのコンパイルが行われます。そしてそのコンパイルされたネイティブコードは、永続的な外部ファイルとして保存されます。pre-JITはアセンブリ単位でコンパイルされるようです。従って実行時にはネイティブが直接ロードされますから、より高速になるのではないでしょうか?
NothingBut.NETFX
大ベテラン
会議室デビュー日: 2001/09/13
投稿数: 102
投稿日時: 2002-03-20 19:21
>問題になっているのは、pre-JITの事だと思います。

そう、それはngenという名前のツールのことです。
object
ぬし
会議室デビュー日: 2002/03/20
投稿数: 338
お住まい・勤務地: 香川県高松市
投稿日時: 2002-03-20 20:05
>そう、それはngenという名前のツールのことです。

pre-JIT はコンパイルの方法だと思います。
ngenが行うかどうかとはまた別の事ではないでしょうか?

実行時にメソッド単位でコンパイルする方法と、インストール時にアセンプリ単位でコンパイルする方法があるという事が大事なんだと思います。
実際、pre-JITはstandart-JITが行うという説明を見た事がありますから。
私は、そう思うんですけど・・・。
NothingBut.NETFX
大ベテラン
会議室デビュー日: 2001/09/13
投稿数: 102
投稿日時: 2002-03-20 22:02
引用:

objectさんの書き込み (2002-03-20 20:05) より:
実行時にメソッド単位でコンパイルする方法と、インストール時にアセンプリ単位でコンパイルする方法があるという事が大事なんだと思います。



で、その話はもうふうすけさんが詳しく解説されていますけど?

私が聞きたかったのは、ふうすけさんの解説の中で、そのpre-JITとは別に、アセンブリの実行時にすべてをJITコンパイルするオプションが存在するかのように読めたので、それはどこかにリファレンスがあるのか、ということです。で、どうやらそれは私の勘違いだったようなので、もう解決したと思ってますけど。
ふうすけ
常連さん
会議室デビュー日: 2002/02/21
投稿数: 44
お住まい・勤務地: 東京
投稿日時: 2002-03-22 10:42
うわ、ちょっと目を離してたら…こんなに話が進んでる

引用:

私が聞きたかったのは、ふうすけさんの解説の中で、そのpre-JITとは別に、アセンブリの実行時にすべてをJITコンパイルするオプションが存在するかのように読めたので、それはどこかにリファレンスがあるのか、ということです。



 要点はPreJIT(ngen)以外にJIT結果をキャッシュするかって事だと思うのですが、出展がさだかではありません確認不足でした、申し訳ない。
 今現在、私が持っている図ではJIT結果をキャッシュするのは ngenだけです、通常のJITで実行した場合のネイティブコードはキャッシュされるわけではありません。その点については間違いだったと思います。


masayh
会議室デビュー日: 2002/03/30
投稿数: 10
投稿日時: 2002-03-30 21:07
>pre-JITでは、...従って実行時にはネイティブが直接ロードされますから、より高速になるのではないでしょうか?

pre-JITではJITコードより実行は遅いです。JITコードより有利なのは、初期ロード時間が小さくなるのとworking setが小さくなることです。

>JavaのHotspotコンパイラは、コードを解析して、よく使われるメソッドをコンパイルして実行することで、コンパイル時間(これはJITterでは実行時間に含まれてしまう)の短縮と、コンパイルによる実行速度の改善との両立を目指しているようです。

これは、profile-guided optimizationといいます。将来の.NETでも対応予定です。

スキルアップ/キャリアアップ(JOB@IT)