問題タブ [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.

0 投票する
1 に答える
319 参照

.net - .NETバイトコードを操作する-JIT再生?

実行時に(署名された).NETプログラムのバイトコードを操作することは可能ですか?たとえば、JITにILを再評価させることによって?

0 投票する
10 に答える
23109 参照

java - JIT を使用した場合とマシン コードにコンパイルした場合の Java のほうが速いのはなぜですか?

Java を高速にするためには JIT を使用する必要があると聞いたことがあります。これは、解釈と比較すると完全に理にかなっていますが、高速な Java コードを生成する事前コンパイラーを作成できないのはなぜでしょうか? については知ってgcjいますが、その出力は通常、たとえば Hotspot よりも速いとは思いません。

これを難しくしている言語について何かありますか? 私はそれがこれらのことだけに帰着すると思います:

  • 反射
  • クラスローディング

私は何が欠けていますか?これらの機能を回避した場合、Java コードを一度ネイティブ マシン コードにコンパイルするだけで完了できますか?

0 投票する
3 に答える
3849 参照

c# - メモリ内の .NET 値型のレイアウト

次の .NET 値の型があります。

System.Runtime.InteropServices.Marshal.OffsetOf を呼び出すことによって検出されたオフセットと共に、値型へのポインターをアンマネージ コードに渡すコードがあります。アンマネージ コードは、Date 値と double 値を設定しています。

StringPair 構造体について報告されるオフセットは、まさに私が期待するものです: 0、8、16、24、32

テスト関数に次のコードがあります。

これらのオフセットを正確に出力します。

次に、いくつかのテスト コードを用意します。ダブル v = ペア.V; ...

デバッガーで次のアセンブラーが関連付けられています。

オフセット 32 (0x20) で D フィールドをロードし、オフセット 24 (0x38-0x20) で V フィールドをロードしています。JITは順序を変えました。Visual Studio デバッガーでも、この逆順が表示されます。

どうして!?私は自分の論理がどこで間違っているのかを確認しようと、髪を引っ張ってきました。構造体で D と V の順序を交換すると、すべてが機能しますが、このコードは、他の開発者が構造体を定義したプラグイン アーキテクチャを処理できる必要があり、難解なレイアウト ルールを覚えているとは期待できません。

0 投票する
2 に答える
478 参照

c# - JIT コンパイラーが静的コンストラクターを初期化するタイミングを決定する方法

最近、.NET 3.5 を使用して開発しているアプリケーションの 1 つで、次の興味深いシナリオを観察しました。この特定のアプリケーションでは、静的変数としてアクセスする singletion オブジェクトがあります。.NET ランタイムは、最初にアクセスしたときにこのシングルトン オブジェクトを初期化するはずだと思っていましたが、そうではないようです。.NET ランタイムは、この特定のオブジェクトにアクセスする前にそれを初期化します。以下は、いくつかの疑似コードです。

実行時でも、私のコードは if ステートメント内のコードのみを実行します。.NET ランタイムはまだシングルトン オブジェクトを初期化します。一部のアプリケーション実行では、この特定のオブジェクトにアクセスする必要はまったくありません!

また、デバッグ ビルドではこの動作は見られません。これは、最適化されたビルド (リリース ビルド) と関係があるようです。

これは .NET ランタイムの予想される動作ですか?

アップデート:

以下は実際のコードです。

クラスMOSSStateHandlerが初期化されるのをブロックする場合、私のアプリケーションはサイドelseでコードを実行しません。

0 投票する
3 に答える
773 参照

c# - 特定の C#/CIL に対して theJITter によって生成されたネイティブ コードを表示する方法はありますか?

この回答に対するコメント(パフォーマンスのために、整数の乗算/除算よりもビット シフト演算子を使用することを提案しています) で、これが実際に高速になるかどうかを質問しました。私の頭の片隅には、あるレベルでは、何かがそれを解決するのに十分賢く、同じ操作であるという考えが>> 1あります. / 2しかし、これが本当なのか、もし本当ならどのレベルで起こるのか、今疑問に思っています。

optimizeテスト プログラムは、引数をそれぞれ除算およびシフトする 2 つのメソッドに対して、次の比較 CIL ( on を使用) を生成します。

そのため、C# コンパイラは巧妙でなくてもdivor命令を発行しています。shrJITter が生成する実際の x86 アセンブラを見たいのですが、これを行う方法がわかりません。それは可能ですか?

編集して追加

所見

そのデバッガーオプションに関する重要な情報が含まれていたため、nobugzからのものを受け入れました。最終的に私のために働いたのは:

  • リリース構成に切り替える
  • Tools | Options | Debugger、「モジュールのロード時に JIT 最適化を抑制する」をオフにします (つまり、JIT 最適化を許可します) 。
  • 同じ場所で、'Enable Just My Code' をオフにします (つまり、すべてのコードをデバッグします) 。
  • Debugger.Break()ステートメントをどこかに置く
  • アセンブリを構築する
  • .exe を実行し、壊れたら既存の VS インスタンスを使用してデバッグする
  • 逆アセンブリ ウィンドウに、実行される実際の x86 が表示されます。

結果は控えめに言っても啓発的でした - JITter は実際に算術演算を実行できることがわかりました! [逆アセンブル] ウィンドウから編集したサンプルを次に示します。を使用して 2 のべき乗で除算するさまざまな-Shifter方法があり>>ます。を使用して整数で除算するさまざまな-Divider方法/

静的に 2 で割る両方のメソッドはインライン化されているだけでなく、実際の計算は JITter によって行われています。

statically-divide-by-3 と同じです。

そして静的に4で割る。

最高の:

インライン化され、これらすべての静的除算が計算されます!

しかし、結果が静的でない場合はどうなるでしょうか? コンソールから整数を読み取るコードを追加しました。これは、その分割に対して生成されるものです。

したがって、CIL が異なっていても、JITter は 2 で割ると右に 1 シフトすることを認識しています。

00000283 idiv eax,ecx

そして、3 で割るには割る必要があることを認識しています。

そして、4 で割ると 2 で右シフトすることを知っています。

最後に(また最高!)

メソッドをインライン化し、静的に利用可能な引数に基づいて、物事を行うための最良の方法を考え出しました。良い。


そうです、C# と x86 の間のスタックのどこかに、それを解決するのに十分なほど賢い何か>> 1あり、/ 2それらは同じです。そして、これらすべてのことから、C# コンパイラ、JITter、および CLR を組み合わせることで、謙虚なアプリケーション プログラマとして試すことができるどんな小さなトリックよりもはるかに賢いものになるという私の意見がさらに重要視されています :)

0 投票する
5 に答える
11231 参照

java - JVM が JIT コンパイル済みコードをキャッシュしないのはなぜですか?

Sun の正規の JVM 実装では、かなり高度な最適化がバイトコードに適用され、コードが数回実行された後にネイティブに近い実行速度が得られます。

問題は、このコンパイルされたコードが、同じ関数/クラスを後で使用するときに使用するためにディスクにキャッシュされないのはなぜですか?

現状では、プログラムが実行されるたびに、JIT コンパイラーはコンパイル済みのバージョンのコードを使用するのではなく、新たに起動します。この機能を追加すると、バイトコードが本質的に解釈されているときに、プログラムの初期実行時間が大幅に短縮されるのではないでしょうか?

0 投票する
2 に答える
270 参照

.net - .NET VM は整数オーバーフローをどのようにチェックしますか?

私たちがよく知っているように、.NET はIntegerOverflow整数がオーバーフローするたびに例外をスローします。これはとても良いことだと思います。

しかし、どうやってこれを速くするのだろうか。x86 は整数のオーバーフローをトラップしません。他のアーキテクチャでそれができるとしたら、私は驚きます。私が x86 で見つけた最善の解決策は、すべての算術演算の後に「INTO」命令を配置することです。しかし、それは顕著な減速につながると思います。

操作がオーバーフローできないことが証明できる場合は、コンパイラで静的チェックを行ってこれを回避できます。しかし、コンパイラが操作の結果を判断できない場合、パフォーマンスが重要な内部ループはどうなるでしょうか?

Mono のソースを見てみましたが、これらのチェックを行っている場所が見つかりませんでした。

それで、彼らが実際に何をしているのか、誰かが手がかりを持っていますか? 本当に知りたいです。

余談ですが、.NET JITC が出力する x86 コードを確認する方法はありますか?

0 投票する
3 に答える
873 参照

android - androidはすぐにjitコンパイラを取得しますか?

作品にはdalvikvm用のjitコンパイラモジュールがあり、その結果は非常に有望であると読みました。実行速度が100%向上したと言う人もいます。それがAndroidリリースにいつ組み込まれるかについて誰かが考えを持っていますか?ネクサス1のRAMの量(512MB)は、jitがまもなく導入される可能性があることを示唆しています。Android 2.5かもしれませんか?

0 投票する
2 に答える
596 参照

javascript - 最新のJavaScriptエンジンはどのような最適化を実行しますか?

これまでに、ほとんどの主流のブラウザーは、最適化JITコンパイラーをJavaScriptインタープリター/仮想マシンに統合し始めました。それは誰にとっても良いことです。さて、私は彼らがどの最適化を実行するのか、そしてそれらを最大限に活用する方法を正確に知るのは難しいでしょう。主要なJavaScriptエンジンのそれぞれにおける最適化に関するリファレンスは何ですか?

バックグラウンド:

私は、より高レベルでより安全な言語からJavaScriptを生成するコンパイラーに取り組んでいます(恥知らずなプラグ:OPAと呼ばれ、非常にクールです)。生成するアプリケーションのサイズを考えると、JavaScriptコードを可能な限り高速でメモリ効率が高いこと。高レベルの最適化を処理できますが、どの低レベルのコードが最良の結果を生成するかを知るために、どのランタイム変換が実行されるかについてもっと知る必要があります。

一例として、私の頭の中から:私がコンパイルしている言語は、すぐに怠惰のサポートを統合するでしょう。JITエンジンは怠惰な関数定義でうまく動作しますか?

0 投票する
3 に答える
8099 参照

c# - アプリケーションの実行時に.NET3.5JITが機能しない

次のコードは、Visual Studio内でリリースを実行する場合と、VisualStudio外でリリースを実行する場合で異なる出力を提供します。Visual Studio 2008を使用しており、.NET3.5をターゲットにしています。.NET3.5SP1も試しました。

Visual Studioの外部で実行している場合は、JITが起動する必要があります。(a)C#で何か微妙なことが起こっているのに欠けているか、(b)JITが実際にエラーになっています。JITがうまくいかないかどうかは疑わしいですが、他の可能性が不足しています...

Visual Studio内で実行する場合の出力:

Visual Studioの外部でリリースを実行した場合の出力:

理由は何ですか?