質問

あのシナリオがJITコンパイラよりも早くその他のコンパイラのようにC++?

と思い、将来はJITコンパイラではまだマイナの最適化、特徴が類似の性能でもありますので、突破するまで無限にコンパイラでコンパイル?

そのようなマルチコアのパラダイムは約束で普遍的なものではない。

他の知?

役に立ちましたか?

解決

ありが確実になる。

  • JIT作成できる用ランタイムプロファイリングの最適化事例を測定することによって、特性のコードが実際にやっていた瞬間に、再コンパイルに"ホっと"コードが必要です。な理論;Javaのホットスポットなのか。
  • 緊張感を最適化できるため、特定のCPUやメモリの設定使用の実際のハードウェアのプログラムが含まれる。例えば、多数。アプリケーションまたは32ビットまたは64ビットコードによっていJITted.64ビットのハードウェアを使用するかについて、よりレジスタに記憶し、より良い指導セットです。
  • 仮想メソッドの呼び出しの内部にタイトループを置き換えできる静電話に基づく実行時の型の参考文献をご参照ください。

があると思ってい飛躍的に進みます。特にうれしいと思う一方で、組み合わせのJITコンパイルと動的タイピングを大幅に向上します。いこと、JavaScriptでスペースとクロムのV8とTraceMonkey.システムになってくるでしょその他改善と同じ規模になっております。これは大切なことでもいわゆる"静的型付き言語が複数の動的な特徴です。

他のヒント

はい、JITコンパイラは、現在の環境に最適化より高速なマシンコードを生成することができます。 JITing自体は時間(より最適化==多くの時間)、およびそれらがそれらを実行するよりも、より多くの時間を消費することがJITing多くの方法のために消費するためしかし、実質的にVMプログラムは、ネイティブプログラムよりも遅いです。そして、GACは、

.NETで導入された理由です

JITingための副作用は大量のメモリ消費です。それは計算速度に関係していないしかし、大容量のメモリ消費量は、あなたのコードがセカンダリストレージにページアウトされる確率を増加させるので、それは、全体のプログラムの実行が遅くなることがあります。

私の悪い英語のためにすみませんます。

JITは利点がありますが、私はそれが完全に引き継いで表示されません。 JITは(最適化によって保存されているよりも多くの時間を割い)あまりにも多くの最適化を両立するために必要とあまりにも少ないながら、従来のコンパイラは(ストレート実行中の多くの時間を取って)、より多くの時間の最適化を過ごすことができます。

明白な答えは、それが上司のところ、それぞれを使用することです。 JITは、従来の多くを(コンパイラがあるが、実行時プロファイルを入力として、最適化を導くために取ることができる)、そして一般的に、再び(よりCPU固有の最適化を行うには余裕ができ、従来のオプティマイザよりも簡単にプロファイリング実行時の利点を活用することができます)コンパイラはこれを実行していますが、異なるシステム上で実行可能ファイルを実行することが予想される場合、彼らはそれをフルに活用することはできません。従来のコンパイラは、より多くの時間を費やして、さまざまな方法でそれを行うことができます。

このため、将来の言語システムは、良好な最適化JITコンパイラによって使用するために設計された実行可能コードを放出する、良好な最適化コンパイラを有するであろう。 (これは、多くの人々のために、また、現在の言語システムである。)(未来の言語システムは、現代のPython / VBスクリプトから噛み砕く醜い高速番号にすべてをサポートします。)

多くのものと同じように、これは、Lispで伏線ました。かなりの時間前に、いくつかのLispシステムは、その場でそれらをコンパイルすることによってLisp関数を解釈し(実際にそこにすべてのこと、多くのCommon Lisp実装されていない、多くの言うことはできません)。 LispのS式(で書かれているコード)解析木のかなり簡単な説明をしているので、コンパイルはかなり速い行くことができます。一方で、最適化のLispコンパイラは、性能が前もって本当に重要だったのコードをクランチ可能性があります。

基本的には、JITコンパイラは、実際にアプリケーションである実行をプロファイリングし、その情報に基づいていくつかのヒントを行う機会を持っています。 「オフライン」のコンパイラは、プログラムを実行し、そのペースを介してそれを入れて、再コンパイルするDEVを尋ね、どのくらいの頻度分岐ジャンプや頻度、それは特別なコードを挿入せずに、フォールスルーを決定することはできません。

なぜ、この問題はいますか?

//code before
if(errorCondition)
{
  //error handling
}
//code after

のようなものに変換取得します:

//code before
Branch if not error to Code After
//error handling
Code After:
//Code After

とx86プロセッサでは、分岐予測部からの情報がない状態で先に条件ジャンプを予測できないでしょう。それはそれは、実行するエラー処理コードを予測し、プロセッサは、それがエラー条件が発生しなかったことを割り出したときにパイプラインをフラッシュする必要があるだろうことを意味します。

JITコンパイラはそれを見て、CPUは正しい方向に予測するように、枝のためのヒントを挿入することができます。確かに、オフラインのコンパイラは、予測ミスを避けるような方法でコードを構造化することができますが、あなたはアセンブリを見てする必要がある場合、あなたはそれがどこにでも周りにジャンプ好きではないかもしれません....

この会話の中でスキップされたもう一つは、あなたがコードの一部をJITするとき、それはメモリ内のフリースポットにコンパイルすることができるということです。 C ++のような言語でDLLは、メモリのその部分は、それがリベースの高価なプロセスを経る必要があります使用できないような基づいている場合。その後、空きメモリ空間にコンパイルDLLをリベース未使用のアドレスへのJITコードに高速です。さらに悪いことに、リベースDLLは共有できません。 (参照 http://msdn.microsoft.com/en-us/magazine/ cc163610.aspxする

私はC#3.5 JITコード中の最適化の一部に非常に感銘を受けていませんでした。圧縮のために必要であるビットいじるような単純なものは、(それがCPUレジスタにキャッシュ値を拒否し、代わりにすべての操作のためにメモリに行ってきました)恐ろしく非効率的です。それがこれを行うなぜ私は知らないが、それは大きな違いになりますし、私はそれについてできることは何もない。

個人的に私は良い解決策は、あなたがそれはあなたのコードの最適化を費やすべきだと思うどのくらいの時間JITコンパイラを伝えるために設定することができ最適化レベル(1-100)になると思います。他の唯一の解決策は、(事前に)コンパイラAOTとなり、その後、あなたは、JITコードの利点の多くを失います。

多くの人々は、多分私は(多分私はスティックの間違った端部を有してい)スキミングい答えたが、私のために、彼らは二つの異なるものがあります:

何もあなたがサンプルプロジェクトダイナモJIT'edマシンコードのコンパイルされたC ++をJIT'ing停止はありません私の知る限り

http://arstechnica.com/reviews/1q00/dynamo/dynamo- 1.htmlする

そして、それは実際には特定の状況下で速度の向上を提供しました。

のC ++コンパイラの意味で、コードのコンパイル言語で書かれたコードを取得し、命令の組にそれを回す手段(またはいくつかの場合、再度コンパイルする別の言語で)論理のいくつかの種類によって実行することができますデバイスます。

例えば。 C ++のアセンブリにコンパイル(私は思う;-) ILにコンパイルやC# またはJavaバイトコードにコンパイルする

JITは実行時に起こるプロセスです。コードを実行するマシンは、それはそれを改善できるかどうかを確認するためにそれを分析します。 JavaやC#コンパイラはVMのためのコマンドを用意して、VMが少なくとも別のは、それを最適化するに行く持ってする機会を持っているとの両方を利用することができます。

一部のプログラムは、彼らはあなたが書いた正確なコードを読み取って実行するマシンを意味し、彼らは解釈されコンパイルされません。これらのマシンは、いくつかのJITを行うためのoppourtunityを持っているが、彼らはまた、静的にコンパイルすることができます覚えて、潜在的に言語の元デザイナーが意図したことがない方法で、サードパーティベンダーなる。

だからあなたの質問に答えるために、私は、JITコンパイラが静的に取って代わるだろうとは思いません。私はいつも(限り、少なくともプログラミングがあるとして)プログラムの表現を取り、いくつかのタイプの機械のための命令セットにそれを変換するための場所があるだろうと思います。 (それを行いながら、潜在的に最適化する)

Javaは、時間を実行し、私はJITが良くなると確信して実行時進化し、プロジェクトダイナモのように与えられたものを、.NETしかし、私は、JITが物語の大きな一部になることだと思います私は、ハードウェアのための余地があると思いますあなたのプロセッサが行うすべては、実行時環境に基づいて再最適化されるように、あまりにもJITを取り上げます。

JITコンパイラは、静的コンパイラをシステムの詳細を知ります。彼らはそれが働いて得れば、マシンに固有の場でmultitheadingを追加すると、巨大な速度改善をすることができます。

一般的に、JITコンパイラは、プログラム/コードの最初の実行は、プリコンパイルされたコードし、の多くのの遅くなる可能性がスタートアップ待ち時間のビットを持っています。コールドスタート不利ます。

JITコンパイルのもう一つの大きな利点は、あなたのプログラムが完全な新しいプログラムの導入を必要とせずに新しいコンパイラのトリックを構築し、獲得された後、コンパイラを更新することができるということである。

まだ言及されていないJITingの一つの利点は、プログラムは、一般的な種類の無限の数を定義することが可能であるということです。たとえばます:

interface IGenericAction { bool Act<T>(); }

struct Blah<T>
{
  public static void ActUpon(IGenericAction action)
  {
     if (action.Act<T>())
       Blah<Blah<T>>.ActUpon(action);
  }
}

Blah<Int32>.ActUpon(act)を呼び出すと、act.Act<Int32>()を呼び出します。そのメソッドがtrueを返した場合、それは意志ターンコールでBlah<Blah<Int32>>.ActUpon(act)act.Act<Blah<Int32>>()を呼び出します。それがtrueを返した場合、より多くの呼び出しは、さらに、深くネストされた形で実行されます。 が呼び出される可能性がをすべてActUponメソッドのコードを生成することは不可能であるが、幸いそれは必要はありませんでしょう。それらが使用されるまでのタイプが生成する必要はありません。 action<Blah<...50 levels deep...>>.Act()がfalseを返した場合、Blah<Blah<...50 levels deep...>>.ActUponBlah<Blah<...51 levels deep...>>.ActUponを呼び出すことはありませんし、後者のタイプを作成する必要はありません。

点しないようにする便宜の供与"オフライン"のコンパイラがコンパイラでusefully対象プラットフォームは、少量のRAMも数十六バイトまでとなります。確かに、何ものでも遠隔でPCに対応えており百倍以上のRAMとはないと思いますの少し前にこの機械は多くのmegsのRAMとコストの低0.50の消費量が少なくよmilliwattの電源で運転します。

なお、16バイトのRAMなので弱い音、チップの小物などをRAMに保管しないでくださいコードではRAM--独立した不揮発性メモリの領域を開催コード(384バイトが最も小さい。ることなく、トータル-プロデュースでできるように、ド0.25プロセッサを行う機能をう$1.00分のディスクリート-コンポーネント.

JITコンパイラには、最適化に影響を与えるために使用することができ、より多くのデータを持っています。もちろん、誰かが実際にはそのように単純ではないので、そのデータを使用するコードを記述する必要があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top