問題タブ [jit]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
.net - 欠落しているアセンブリ参照を使用してコンパイルするJIT
興味深い問題に遭遇しました。いくつかのアセンブリで構成されたアプリケーションがあります。アプリケーションをインストールしましたが、必須ではない小さなアセンブリを1つ忘れました。そのアセンブリの使用を必要とするメソッドに到達するまで、アプリケーションは起動して正常に動作しているように見えました。ご想像のとおり、"Could not load file or assembly 'Blah, Version=1.0.0.0, Culture=neutral, PublicKeyToken=Blah' or one of its dependencies. The system cannot find the file specified."
例外が表示されます。
そこに驚きはありませんよね?はい、インストーラーは修正でき、私の問題は解決しましたが、プログラムでそれを行う方法があるかどうかを確認したかったのです。そこで、必須ではないアセンブリを使用するコードをtryブロックでラップし、finallyブロックで高価なリソースを次のように解放してみました。
JITコンパイラがtryブロック内からスローして、最終的に制御をfinallyブロックに戻し、リソースが解放されると考えています。JITコンパイラは、メソッドが呼び出された時点でスローします。
コールチェーンの最後のブロックを上に移動することを考えましたが、このメソッドは何百もの場所から呼び出されています。必須ではないアセンブリにAssembly.Loadを使用することを考えましたが、反射を使用する必要があるという考えは、私を汚く感じさせます。
この場合、再構築しすぎたり、シャワーを浴びたりせずに、finallyブロックを実行する方法はありますか?つまり、リフレクションを使用しますか?
.net - パフォーマンス カウンター "# of Methods Jitted" はどのように解釈されるべきですか?
管理された nt サービスで報告された問題を再現しようとしているときに、パフォーマンス カウンター "# of Methods Jitted" が ("# of IL Bytes Jitted" と共に) 常に増加していることに気付きました。報告された動作は、大量のメモリ (必ずしもマシンで利用可能なすべてではない) を使用し、100% の CPU を消費することで構成されています。この nt サービスへの要求 (wcf 経由) は、多くの場合、タイムアウト (つまり 90 秒以上) になります。(要求は、同じマシン上の asp.net サイトから発信されます。)
15 分間のウォームアップ時間後の値は 127k (3610 kb) で、1 時間経過後の値は 246k (6427 kb) でした。つまり、119k の jitted メソッドの増加です。
サービスが混乱するまでの実行時間はわずか数時間であるため、報告された問題を引き起こしているのはこの動作だけではないと思います。
しかし、私は、この[明らかに]増え続ける数をどのように解釈するかについて、まだ興味があります. 1 時間あたりわずか 3 mb ですが、1 週間あたり 500 mb になります。また、「# of IL Bytes Jitted」がガベージ コレクションの対象かどうかは誰にもわかりませんか?
(この投稿を書くのにかかった 20 分の間に、メソッドの数は 33k 増加し、バイト数は最大 300k 増加しました。)
明確化
最初に言及すべきだったこと... ;)
- アプリドメインを作成、ロード、またはアンロードするコードはありません。
- 何も出力せず、C# 3 を使用しているため、動的オブジェクトはありません。
- NHibernate と AutoMapper を使用しており、どちらもリフレクションを使用して目標を解決しています。ただし、これらのライブラリは適切に動作し、この動作を引き起こすことはないと思います。(どのメソッドが jit されているかを確認できるツールはありますか?)
変更点
- コード行数と jitted メソッド数の比較を削除します。Oded が指摘しているように、カウンターには .NET Framework 内のメソッドも含まれています。
jit - JIT を EXE に変換しますか?
非常に多くの JIT 実装が存在するため、すべての JIT がネイティブ コードを発行します。では、ネイティブ コードをネイティブ実行可能ファイルに保存するための JIT2EXE のようなツールを作成しなかったのはなぜでしょうか。
assembly - バイナリ ファイルの非常に小さな部分をプログラムで置き換える適切な方法は何ですか?
ゲームプレイ バイナリの一部をその場でコンパイルするゲーム コード (ioquake3 プロジェクトから) があります (qvm システム)。現在、この操作の以前に保存されたバイナリをロードすることで、潜在的に高速化できます (ファイルの変更に関する予防措置が講じられています)。
ただし、これらのバイナリに保存された関数へのポインターは、セッションを通じて永続的ではありません。
その場でそれらを変更する適切な方法は何でしょうか? (メインアプリケーションで利用可能なアセンブラとアセンブリがあることを考慮してください)
c# - .NETCLRは実際に現在のプロセッサ向けに最適化されていますか
C#やJavaなどのJITted言語のパフォーマンスについて読んだとき、作成者は通常、多くのネイティブコンパイル済みアプリケーションよりも理論的に優れている必要がある/できると言っています。ネイティブアプリケーションは通常、プロセッサファミリ(x86など)用にコンパイルされるだけであるという理論です。したがって、コンパイラは、すべてのプロセッサで実際に最適化されるとは限らないため、特定の最適化を行うことができません。一方、CLRは、JITプロセス中にプロセッサ固有の最適化を行うことができます。
Microsoft(またはMono)のCLRが実際にJITプロセス中にプロセッサ固有の最適化を実行するかどうかを誰かが知っていますか?もしそうなら、どのような最適化ですか?
.net - .NET VM (CLR) で JIT コンパイルされたコードを表示する方法
JIT-Compiler によって生成されたネイティブ コードのトレースを取得するにはどうすればよいですか?
ありがとう
java - Just-in-Time コンパイラとインタプリタの違いは何ですか?
ジャストインタイム コンパイラとインタープリターの違いは何ですか?また、.NET と Java JIT コンパイラの違いは何ですか?
windows-phone-7 - WindowsPhone7およびネイティブC++/ CLI
Microsoftは最近、新しいPhone 7プラットフォーム用のツールとドキュメントをリリースしましたが、(私のような)大きなC ++コードベースを持っている人は、ネイティブ開発をサポートしていません。この決定が覆されているという憶測を見つけましたが、私はそれを疑っています。そのため、C ++ / CLIでコンパイルするように適応させることで、このコードベースをPhone7で利用できるようにすることがどれほど実行可能かを考えていました。もちろん、ユーザーインターフェイスの部分は移植できませんでしたが、残りの部分についてはよくわかりません。誰もが同じような経験をしましたか?私は重い低レベルのものを実行するコードについて話しているのではありませんが、テンプレートとスマートポインターが非常に頻繁に使用されています。
.net - Threading.MemoryBarrier を使用して .Net で「フル フェンス」がどのように実装されているかについて、誰かが簡単に説明できますか?
MemoryBarrier の使用法については明確ですが、ランタイムの舞台裏で何が起こっているかについては明確ではありません。誰が何が起こっているのかについて良い説明をすることができますか?
java - Javaと.NetのJITの違いは何ですか
Microsoft .NETはCLRをJITコンパイラとして使用しますが、Javaにはホットスポットがあります。それらの違いは何ですか?