タグ付けされた質問 「jit」

ジャストインタイムコンパイル(JIT)は、インタープリター型コードをマシンコードに変換することにより、そのパフォーマンスを向上させるために使用される手法です。

10
Javaで2 *(i * i)が2 * i * iより速いのはなぜですか?
次のJavaプログラムの実行には、平均で0.50秒から0.55秒かかります。 public static void main(String[] args) { long startTime = System.nanoTime(); int n = 0; for (int i = 0; i < 1000000000; i++) { n += 2 * (i * i); } System.out.println((double) (System.nanoTime() - startTime) / 1000000000 + " s"); System.out.println("n = " + n); } で置き換える2 * …

12
PyPyが6.3倍高速である場合、CPythonではなくPyPyを使用すべきではないのはなぜですか?
PyPyプロジェクトについてはよく聞いています。彼らはそれが彼らのサイトのCPythonインタープリターより6.3倍速いと主張しています。 Pythonのような動的言語について話すときはいつでも、速度が最大の問題の1つです。これを解決するために、彼らはPyPyが6.3倍速いと言います。 2つ目の問題は、悪名高いグローバルインタープリターロック(GIL)である並列処理です。このため、PyPyはGILのないPythonを提供できると述べています。 PyPyがこれらの大きな課題を解決できるとしたら、PyPyの幅広い採用を妨げている弱点は何ですか?つまり、典型的なPython開発者である私のような誰かが、今 PyPyに切り替えるのを妨げているのは何ですか?


2
JDKコードの実行時にJava JITはチートしますか?
私はいくつかのコードのベンチマークを行っていましたがjava.math.BigInteger、まったく同じアルゴリズムを使用していても、と同じくらい高速に実行することができませんでした。だから私java.math.BigIntegerは自分のパッケージにソースをコピーしてこれを試しました: //import java.math.BigInteger; public class MultiplyTest { public static void main(String[] args) { Random r = new Random(1); long tm = 0, count = 0,result=0; for (int i = 0; i < 400000; i++) { int s1 = 400, s2 = 400; BigInteger a = new BigInteger(s1 * 8, r), …
405 java  jvm  jit  jvm-hotspot 

3
.NET JIT潜在的なエラー?
次のコードは、Visual Studio内でリリースを実行するときと、Visual Studioの外でリリースを実行するときの出力が異なります。Visual Studio 2008を使用しており、.NET 3.5をターゲットにしています。.NET 3.5 SP1も試しました。 Visual Studioの外部で実行している場合、JITが起動します。(a)C#で微妙な問題が発生している、または(b)JITに実際にエラーがある。JITがうまくいかないのではないかと思いますが、他の可能性が不足しています... Visual Studio内で実行したときの出力: 0 0, 0 1, 1 0, 1 1, Visual Studioの外部でリリースを実行したときの出力: 0 2, 0 2, 1 2, 1 2, 理由は何ですか? using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Test { struct IntVec { public int x; public int …
404 c#  jit 

5
JVMがJITコンパイル済みコードをキャッシュしないのはなぜですか?
Sunの標準的なJVM実装は、かなり洗練された最適化をバイトコードに適用して、コードが数回実行された後、ネイティブに近い実行速度を取得します。 問題は、このコンパイルされたコードが、同じ関数/クラスの後続の使用中に使用するためにディスクにキャッシュされないのはなぜですか? 現状では、プログラムが実行されるたびに、JITコンパイラは、コンパイル済みのバージョンのコードを使用するのではなく、新たに起動します。この機能を追加すると、バイトコードが本質的に解釈されているときに、プログラムの最初の実行時間が大幅に増加しませんか?
107 java  caching  jvm  compilation  jit 

8
JVMのJITコンパイラーは、ベクトル化された浮動小数点命令を使用するコードを生成しますか?
私のJavaプログラムのボトルネックは、ベクトルドット積の束を計算するためのいくつかのタイトなループであるとしましょう。はい、プロファイリングしました、はい、それがボトルネックです、はい、それは重要です、はい、それはまさにアルゴリズムです。はい、Proguardを実行してバイトコードを最適化しました。 仕事は本質的に、ドット積です。同様に、2つfloat[50]あり、ペアワイズ積の合計を計算する必要があります。SSEやMMXのように、この種の操作をすばやく大量に実行するためのプロセッサ命令セットが存在することは知っています。 はい、おそらくJNIでネイティブコードを書くことでこれらにアクセスできます。JNIの呼び出しにはかなりの費用がかかります。 JITがコンパイルするものまたはコンパイルしないものを保証できないことはわかっています。誰もがしている、これまで、これらの命令を使用してJIT生成コードのことを聞きましたか?もしそうなら、このようにコンパイル可能にするのに役立つJavaコードについて何かありますか? おそらく「ノー」です。尋ねる価値があります。

4
ループ反転技術とは何ですか?
Javaのジャストインタイムコンパイラー(JIT)最適化手法について説明しているドキュメントを調べていました。それらの1つは「ループ反転」でした。そして文書は言う: 通常のwhileループをループに置き換えdo-whileます。そして、 do-whileループはif節内で設定されます。この置換により、ジャンプが2つ少なくなります。 ループ反転はどのように機能し、コードパスを最適化しますか? 注意: Javaコードの例と、JITがそれをネイティブコードに最適化する方法と、最新のプロセッサで最適化される理由を誰かが説明できればすばらしいと思います。

5
C#JITコンパイルと.NET
JITコンパイラの動作の詳細について少し混乱しました。私はC#がILにコンパイルされることを知っています。初めて実行されるときはJITされます。これには、ネイティブコードに変換されることが含まれますか?.NETランタイム(仮想マシンとして?)はJITされたコードと相互作用しますか?私はこれが素朴であることを知っていますが、私は本当に自分自身を混乱させました。私の印象では、アセンブリは.NETランタイムによって解釈されませんが、相互作用の詳細はわかりません。
86 c#  jit 



8
なぜ演算子はメソッド呼び出しよりもはるかに遅いのですか?(構造体は古いJITでのみ遅くなります)
イントロ: 私はC#で高性能コードを書きます。はい、C ++を使用すると最適化が向上することはわかっていますが、それでもC#を使用することにしました。私はその選択について議論したくありません。むしろ、私のように、.NETFrameworkで高性能のコードを書き込もうとしている人たちから話を聞きたいと思います。 質問: 以下のコードの演算子が同等のメソッド呼び出しよりも遅いのはなぜですか? 以下のコードで2つのdoubleを渡すメソッドが、内部に2つのdoubleを持つ構造体を渡す同等のメソッドよりも速いのはなぜですか?(A:古いJITは構造体の最適化が不十分です) .NET JITコンパイラに単純な構造体を構造体のメンバーと同じくらい効率的に処理させる方法はありますか?(A:新しいJITを入手してください) 私が知っていると思うこと: 元の.NET JITコンパイラは、構造体を含むものをインライン化しませんでした。奇妙な与えられた構造体は、組み込みのように最適化されるべきであるが本当である小さな値型が必要な場合にのみ使用されるべきです。幸い、.NET3.5SP1と.NET2.0SP2では、特に構造体のインライン化の改善など、JITオプティマイザーにいくつかの改善が加えられました。(そうでなければ、彼らが導入した新しいComplex構造体がひどく実行されたので、彼らはそれをしたと思います...したがって、ComplexチームはおそらくJIT Optimizerチームをドキドキしていました。)したがって、.NET 3.5SP1より前のドキュメントはおそらくこの問題にはあまり関係ありません。 私のテストが示すこと: C:\ Windows \ Microsoft.NET \ Framework \ v2.0.50727 \ mscorwks.dllファイルのバージョンが3053以上であることを確認することで、新しいJITオプティマイザーがあることを確認しました。 JITオプティマイザに。しかし、それでも、私のタイミングと分解の両方が示すものは次のとおりです。 2つのdoubleを持つ構造体を渡すためのJIT生成コードは、2つのdoubleを直接渡すコードよりもはるかに効率が低くなります。 構造体メソッドのJIT生成コードは、引数として構造体を渡す場合よりもはるかに効率的に「this」を渡します。 明らかにループ内にあるため、乗数を使用しても、2つのdoubleを含む構造体を渡すよりも、2つのdoubleを渡す方が、JITのインライン化が向上します。 タイミング: 実際、逆アセンブルを見ると、ループ内のほとんどの時間はリストからテストデータにアクセスしているだけであることがわかります。ループのオーバーヘッドコードとデータへのアクセスを考慮に入れると、同じ呼び出しを行う4つの方法の違いは劇的に異なります。PlusEqual(Element)の代わりにPlusEqual(double、double)を実行すると、5倍から20倍のスピードアップが得られます。また、演算子+ =の代わりにPlusEqual(double、double)を実行する場合は10倍から40倍になります。ワオ。悲しい。 タイミングのセットは次のとおりです。 Populating List<Element> took 320ms. The PlusEqual() method took 105ms. The 'same' += operator took 131ms. The 'same' -= …

3
出力-1はループでスラッシュになります
驚いたことに、次のコード出力: / -1 コード: public class LoopOutPut { public static void main(String[] args) { LoopOutPut loopOutPut = new LoopOutPut(); for (int i = 0; i < 30000; i++) { loopOutPut.test(); } } public void test() { int i = 8; while ((i -= 3) > 0) ; String value = …
54 java  string  while-loop  jvm  jit 

2
Java:手動で展開されたループは、元のループよりも高速です。どうして?
長さ2の配列に対する次の2つのコードスニペットを考えてみます。 boolean isOK(int i) { for (int j = 0; j < filters.length; ++j) { if (!filters[j].isOK(i)) { return false; } } return true; } そして boolean isOK(int i) { return filters[0].isOK(i) && filters[1].isOK(i); } 十分なウォームアップ後、これら2つのピースのパフォーマンスは同様になるはずだと思います。ここやここなどで 説明されているように、JMHマイクロベンチマークフレームワークを使用してこれをチェックし、2番目のスニペットが10%以上高速であることを確認しました。 質問:Javaが基本的なループ展開技術を使用して最初のスニペットを最適化していないのはなぜですか? 特に、以下について理解したいと思います。 2つのフィルターの場合に最適なコードを簡単に作成できますが、別の数のフィルターの場合でも機能します(単純なビルダーを想像してください) return (filters.length) == 2 ? new FilterChain2(filters) : new FilterChain1(filters)。JITCは同じことを行うことができますか? …

1
最適化せずに高性能のJavascriptコードを書く
大きな数値配列を操作するJavascriptでパフォーマンスに敏感なコードを書くとき(線形代数パッケージ、整数または浮動小数点数を操作することを考えてください)、JITができる限り役立つことを常に望んでいます。これはおおよその意味です。 整数計算と浮動小数点計算のどちらを実行するかに応じて、常に配列をパックSMI(短整数)またはパックDoubleにする必要があります。 私たちは常に同じタイプのものを関数に渡したいので、それらが「メガモーフィック」とラベル付けされて最適化されないようにします。たとえば、常にvec.add(x, y)両方xを呼び出しyてパックされたSMI配列、または両方をパックされたDouble配列で呼び出す必要があります。 関数をできるだけインライン化したい。 これらのケースから外れると、突然の大幅なパフォーマンス低下が発生します。これは、さまざまな無害な理由で発生する可能性があります。 のような一見無害な操作を介して、パックされたSMI配列をパックされたDouble配列に変換できmyArray.map(x => -x)ます。パックされたDouble配列は依然として非常に高速であるため、これは実際には「最良の」悪いケースです。 たとえば、(予期せず)返された、nullまたはを返した関数に配列をマッピングすることにより、パックされた配列を一般的なボックス配列に変換できundefinedます。この悪いケースはかなり簡単に回避できます。 あなたはvec.add()あまりにも多くのタイプの物を渡して、それをメガモーフィックに変えることによってなど、関数全体を最適化解除するかもしれません。これは、「ジェネリックプログラミング」を実行する場合に発生する可能性vec.add()があります。これは、タイプに注意していない場合(多くのタイプが入っていることがわかる)と、最大のパフォーマンスを引き出したい場合の両方で使用されます。 (たとえば、ボックス化されたdoubleのみを受け取る必要があります)。 私の質問は、上記の考慮事項に照らして高性能のJavascriptコードを記述しながら、コードを見やすく読みやすく保つ方法についての、やさしい質問です。私が目指している答えの種類がわかるように、いくつかの特定のサブ質問: (たとえば)パックされたSMI配列の世界にとどまりながらプログラミングする方法に関する一連のガイドラインはありますか? マクロシステムのようなものを使用せずにJavaScriptで汎用の高性能プログラミングvec.add()を呼び出しサイトにインライン化することは可能ですか? メガモーフィックな呼び出しサイトや最適化解除などの観点から、高性能のコードをライブラリにモジュール化する方法を教えてください。たとえば、線形代数パッケージAを高速で楽しく使用している場合B、に依存するパッケージをインポートしますがA、Bそれを他のタイプで呼び出して最適化を解除すると、突然(コードを変更せずに)コードの実行が遅くなります。 何か良いがある使いやすい JavaScriptエンジンがタイプで、内部でやっていることを確認するための測定ツールは?

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.