問題タブ [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.
c++ - Just-In-Time コンパイルを行う正規表現エンジンはありますか?
私の質問は
正規表現パターンの解析中にジャストインタイムのコンパイルを行い、テキストの照合/置換時に使用する正規表現エンジンはありますか? または、i386 または x64 アーキテクチャーの JIT はどこで学べますか?
必要な理由
私は最近、約 10MB のデータを持つ通常の C コードと比較して、Python の組み込み正規表現エンジンをベンチマークしようとしていました。
単純な置換 (たとえば ) の場合、比較的高速であることがわかりましたab
。Czzz
よりも 2 倍から 3 倍遅いだけです。
ただし、[a-z]c
C の 5 ~ 8 倍の時間がかかりました。
また、グループ化 (たとえば([a-z])(c)
to AA\2\1BB
) を使用すると、C の 20 倍から 40 倍の時間がかかりました。
まだジャストインタイムのコンパイルではありませんが、ジャストインタイムのコンパイルができれば、もっと高速になると思います。
PS: パターンをコンパイルする際に正規表現パターンごとにプロファイリングを使用しab
ます。 .[a-z]c
([a-z])(c)
更新 1
psyco で試してみましたが、速度はそれほど向上しません。何度もループするのではなく、ビッグデータに対してテキストの置き換えを行っているためかもしれません。
私が間違っていなければ、Pythonre.sub
はすでにネイティブで実行していると思うので、pyscoはそれほど速度を向上させることはできません.
更新 2
Python にラップされたブースト正規表現を試してみましたが、Python の正規表現よりもさらに遅いため、ボトルネックは Python の文字列処理にあるようで、Jan Goyvaerts も回答でそれを指摘しています。
アップデート
ab[a-z]c
次の同等の C コード ( *s
10MB の長いテキストを指す)のように、正規表現パターンをマシン コードに変換したいと思います。
何か案は?
java - JavaJITバグの回避
Java環境で奇妙なバグが発生しているようです。これで、同じ「発生しない」例外が2回発生しました。あるケースでは、実行中のプロセスで48分間に42,551回問題が発生し、その後自然に解消されました。
失敗したコードは、次の行によってトリガーされます。
ここでint source = 0
、long quoteID = 44386874
(たとえば)。
例外は次のとおりです。
コードをチェックしても、'd'
この例外が発生することはありません。
私たちが思いついた最も良い説明は、JITコンパイラが不正なバイトコードを生成しているということですが、その後の再JITでは、正常なコードを記述します。
誰かがそのような問題を回避/診断する方法の経験がありますか?
ロジャー。
assembly - C 言語用の完全な x86/x64 JIT アセンブラー
このようなものを知っていますが、C プログラムに埋め込むことができますか?
llvm - C プログラムから LLVM Jit を呼び出す
llvm.org のオンライン コンパイラを使用して bc ファイルを生成しました。この bc ファイルを ac または C++ プログラムからロードし、llvm jit を使用して bc ファイルで IR を実行できるかどうかを知りたいです (プログラムでc プログラム)、結果を取得します。
どうすればこれを達成できますか?
c# - リフレクションを使用して作成されたクラスと「通常の」クラスのコードの実行時のパフォーマンス
リフレクションを介してロードされるクラスのコードの実行時(実行時)のパフォーマンスは、新しいキーワードを使用してクラスが作成されたときの同じコードと同じですか?
はいと言います。しかし、私はこれについて、リフレクション指向のコードは常に遅いと信じている同僚と話し合っていました。
私の見解では、クラスが最初にロード/作成された方法に関係なく、JITコンパイラーはクラスがどのようにロードされたかを気にしないため、パフォーマンスは同じになります。
私は正しいですか?いずれにせよ、これを明確にするのに役立つ参考資料をいただければ幸いです。
(注:リフレクションと新しいキーワードを使用してクラスを作成するパフォーマンスについては話していません。作成後のクラスのメソッドで実際のコードを参照しています。)
.net - .NETバイトコードを操作する-JIT再生?
実行時に(署名された).NETプログラムのバイトコードを操作することは可能ですか?たとえば、JITにILを再評価させることによって?
java - JIT を使用した場合とマシン コードにコンパイルした場合の Java のほうが速いのはなぜですか?
Java を高速にするためには JIT を使用する必要があると聞いたことがあります。これは、解釈と比較すると完全に理にかなっていますが、高速な Java コードを生成する事前コンパイラーを作成できないのはなぜでしょうか? については知ってgcj
いますが、その出力は通常、たとえば Hotspot よりも速いとは思いません。
これを難しくしている言語について何かありますか? 私はそれがこれらのことだけに帰着すると思います:
- 反射
- クラスローディング
私は何が欠けていますか?これらの機能を回避した場合、Java コードを一度ネイティブ マシン コードにコンパイルするだけで完了できますか?
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 の順序を交換すると、すべてが機能しますが、このコードは、他の開発者が構造体を定義したプラグイン アーキテクチャを処理できる必要があり、難解なレイアウト ルールを覚えているとは期待できません。
c# - JIT コンパイラーが静的コンストラクターを初期化するタイミングを決定する方法
最近、.NET 3.5 を使用して開発しているアプリケーションの 1 つで、次の興味深いシナリオを観察しました。この特定のアプリケーションでは、静的変数としてアクセスする singletion オブジェクトがあります。.NET ランタイムは、最初にアクセスしたときにこのシングルトン オブジェクトを初期化するはずだと思っていましたが、そうではないようです。.NET ランタイムは、この特定のオブジェクトにアクセスする前にそれを初期化します。以下は、いくつかの疑似コードです。
実行時でも、私のコードは if ステートメント内のコードのみを実行します。.NET ランタイムはまだシングルトン オブジェクトを初期化します。一部のアプリケーション実行では、この特定のオブジェクトにアクセスする必要はまったくありません!
また、デバッグ ビルドではこの動作は見られません。これは、最適化されたビルド (リリース ビルド) と関係があるようです。
これは .NET ランタイムの予想される動作ですか?
アップデート:
以下は実際のコードです。
クラスMOSSStateHandlerが初期化されるのをブロックする場合、私のアプリケーションはサイドelseでコードを実行しません。
c# - 特定の C#/CIL に対して theJITter によって生成されたネイティブ コードを表示する方法はありますか?
この回答に対するコメント(パフォーマンスのために、整数の乗算/除算よりもビット シフト演算子を使用することを提案しています) で、これが実際に高速になるかどうかを質問しました。私の頭の片隅には、あるレベルでは、何かがそれを解決するのに十分賢く、同じ操作であるという考えが>> 1
あります. / 2
しかし、これが本当なのか、もし本当ならどのレベルで起こるのか、今疑問に思っています。
optimize
テスト プログラムは、引数をそれぞれ除算およびシフトする 2 つのメソッドに対して、次の比較 CIL ( on を使用) を生成します。
対
そのため、C# コンパイラは巧妙でなくてもdiv
or命令を発行しています。shr
JITter が生成する実際の 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 を組み合わせることで、謙虚なアプリケーション プログラマとして試すことができるどんな小さなトリックよりもはるかに賢いものになるという私の意見がさらに重要視されています :)