問題タブ [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.
java - Java および .NET ヒープのオーバーヘッド
ヒープとガベージコレクターの仕組みを理解しています。ガベージコレクションは世代ごとに発生し、メモリ割り当ては順次発生し、ガベージコレクション中にデータをシフトして継続ブロックを形成することで圧縮された空き/未使用スペースなどがあります。
割り当てられたメモリ チャンクのヘッダーはありますか?それらはどのくらいの大きさですか (.NET CLR の場合は 8 ~ 16 バイトだと聞きました)、バイト、ワード、またはクワッド ワード アラインメントが存在する場合は? x86 および x64 プロセッサ アーキテクチャの JIT (Java) および CLR (.NET Framework または Mono) の実装に関する情報に興味があります。
c# - .NET JIT は空のループを最適化しますか?
この記事では、別の方法を提案しています。ただし、ループ条件を評価する必要はまだあります。Javaはこのケースを認識するために特定のトリックを採用しているだけですか?
c# - CLR と JIT
JIT コンパイラと CLR の違いは何ですか? コードを il にコンパイルし、CLR がそのコードを実行する場合、JIT は何をしているのでしょうか? CLR にジェネリックが追加されたことで、JIT コンパイルはどのように変化しましたか?
c# - JIT をオフにし、MSIL (独自の VM) でコードフローを制御する
私は C# で独自のスクリプト言語を作成しており、いくつかの機能を気に入っています。MSIL を出力のバイトコードとして使用することにしました (Reflection.Emit は非常に便利で、別のバイトコードを考える必要はありません)。それは機能し、実行可能ファイルを発行します。これは実行可能で (Reflector で逆コンパイルすることもできます:))、非常に高速です。
しかし - 1 つのプロセス + 1 つのスレッドで複数の「プロセス」を実行し、割り当てられた CPU 時間を手動で制御したい (.NET フレームワークによって提供されるより堅牢な IPC も実装する) JIT を完全に無効にして独自のプロセスを作成する方法はありますかVM、.NET フレームワーク (およびメモリ使用量の制御など) を使用した命令ごとのステップ実行、自分で何かを記述する必要なし、またはこれを達成するには、MSIL 解釈全体を記述する必要がありますか?
編集 1): IL の解釈は、宇宙で最速のものではないことを知っています :)
編集2):明確にするために-VMをある種の「オペレーティングシステム」にしたい-CPU時間を取得し、プロセス間で分割し、それらのメモリ割り当てを制御します。高速である必要も効果的である必要もありませんが、私の実験の概念実証にすぎません。すべての命令を処理するレベルでそれを実装する必要はありません。これを .NET で実行する必要がある場合は、気にしません。言いたいのは、1 つの命令をステップ実行し、次のステップを指示するまで待つことです。
編集 3): 私は、ICorDebug がおそらく私のニーズを達成できることに気付きました。今、Mono のランタイムの実装を調べています。
c# - 私の 32 ビットの頭痛は 64 ビットの片頭痛になりました?!? (または 64 ビット .NET CLR ランタイムの問題)
.NET アプリケーションを 64 ビット JIT と 32 ビット JIT で実行することから切り替えたときに、パフォーマンス、メモリなどの点で、通常とは異なる予期しない結果が発生しましたか? 私は良いことに興味がありますが、人々が遭遇した驚くほど悪い問題にもっと興味があります.
32 ビットと 64 ビットの両方で展開される新しい .NET アプリケーションを作成中です。アプリケーションの移植に関する問題に関連する多くの質問がありました - 私はプログラミング/移植の観点からの「問題」には関心がありません。(つまり: ネイティブ/COM 相互運用を正しく処理する、構造体のサイズを変更する構造体に埋め込まれた参照型など)
しかし、この質問とその答えは私に考えさせました - 私が見落としている他の問題は何ですか?
この問題を回避したり、その 1 つの側面に触れたりする多くの質問やブログ投稿がありましたが、適切な問題のリストをまとめたものは見たことがありません。
特に、私のアプリケーションは非常に CPU バウンドであり、大量のメモリ使用パターン (したがって、そもそも 64 ビットが必要) であり、本質的にグラフィカルです。私は、64 ビット Windows (.NET 3.5sp1 を使用) で実行されている CLR または JIT に、他にどのような隠れた問題が存在する可能性があるかを懸念しています。
現在わかっているいくつかの問題を次に示します。
- (今ではわかっています) プロパティは、たとえ自動プロパティであっても、x64 ではインライン化されません。
- アプリケーションのメモリ プロファイルは、参照のサイズが原因で変化するだけでなく、メモリ アロケータのパフォーマンス特性も異なるため、変化します。
- x64 では起動時間が長くなる可能性があります
64 ビット Windows の JIT で発見された他の具体的な問題と、パフォーマンスの回避策があるかどうかを知りたいです。
皆さん、ありがとうございました!
- - 編集 - - -
明確にするために-
早期に最適化しようとするのはよくないことだと認識しています。システムを二番目に推測することはしばしば悪いことであることを私は知っています。また、64 ビットへの移植性には独自の問題があることも知っています。これを支援するために、64 ビット システムで毎日実行およびテストしています。等
ただし、私のアプリケーションは一般的なビジネス アプリケーションではありません。これは、科学的なソフトウェア アプリケーションです。一度に何時間も、すべてのコア (高度にスレッド化されている) で 100% の CPU を使用して座っている多くのプロセスがあります。
私はアプリケーションのプロファイリングに多くの時間を費やしており、それが大きな違いを生み出しています。ただし、ほとんどのプロファイラーは JIT の多くの機能を無効にしているため、プロファイラーで実行している場合、メモリ割り当て、JIT のインライン化などの細部を突き止めるのは非常に困難です。したがって、質問が必要です。
c# - どのレベルでC#コンパイラまたはJITがアプリケーションコードを最適化しますか?
コードサイズを小さくするためにこの情報を知りたいので、コンパイラーまたはJITによって実行されることを最適化するために時間を無駄にしないでください。
例えば:
コンパイラがプロパティのget関数の呼び出しをインライン化すると仮定すると、関数呼び出しを回避するために戻り値をローカル変数に保存する必要はありません。
何が起こっているのかを説明する良いリファレンスをお勧めしたいですか?
c# - JIT コンパイルはキャッシュに対してどのように機能しますか?
C# でアプリケーションを作成して実行すると、次回の実行時に再度コンパイルされないのでしょうか。それとも、アプリケーションが起動するたびに、使用されるすべてのものが再コンパイルされるのでしょうか?
JIT コンパイルはキャッシュに対してどのように機能しますか?