質問

自分で言うのも何ですが、使用JITさらにお得な価格での改善実行時の性能を静的に作成しているため、C++?そのようなホットスポット分析および分岐予測に基づく観察時のランタイムでの性能向上のために任意のコードが、ん、ありがとうございまのいくつかの基本的な戦略的な理由でそのような観察の実施中の変動額ランタイムのみ可能な仮想マシン.私は独自のリコールのoverhearing C++コンパイラの作家のつぶやく"で行うことができますのために書かれたプログラムをC++からそう遠くないところを聞きながらダイナミックな言語の愛好家につ統計情報を収集して並べ替え、そのコードが自分のウェブ検索のための証拠を支えるメモリが非常に増えてきております。

役に立ちましたか?

解決

プロファイルに基づく最適化は、実行時の最適化とは異なります。最適化はまだプロファイリング情報をに基づいて、オフラインで行われますが、バイナリが同梱されていたら、何の継続的な最適化が存在しないので、プロファイルに基づく最適化フェーズの使用パターンを正確に実世界の使用状況を反映していない場合は、結果がされるされます不完全、およびプログラムは、異なる使用パターンに適応しません。

あなたは< HPのダイナモ上の情報を探しに興味深いかもしれ/>、そのシステムがネイティブバイナリに焦点を当てたものの - 。>ネイティブバイナリ変換、C ++がほぼ独占的にネイティブコードにコンパイルされているので、私はそれはあなたが探しているまさにだと仮定したが、

また、JITコンパイラをサポートするフレームワークと中間表現である、 LLVM のを見てみたいことがありコンパイルと実行時の最適化、C ++をコンパイルし、実行+ランタイムはまだそれを最適化することができ、実際に任意のLLVMベースのランタイムがある場合、私はわからないもののます。

他のヒント

私は最後の年でかなり多くの最適化のようなものをやりました。それは私が実装されてきたグラフィックレンダリングAPIのためでした。汎用機能を遅くする方法だったとして、APIは、数千の異なる描画モードを定義しているので。

私は(ASMに非常に近いが、投入されたいくつかの高レベルの制御構造とローカル変数で)ドメイン固有言語のための私自身の小さなJITでコンパイラを書くことになりました。

私が得たパフォーマンスの向上は、(コンパイルされたコードの複雑さに依存する)要因10と60の間であったので、余分な作業は大きな時間を完済しています。

PC上で私は自分のJITコンパイラを書くために起動しないだろうが、JITコンパイルのためにLIBJITやLLVMのいずれかを使用します。それが原因私はLIBJIT / LLVMでサポートされていない非主流の組み込みプロセッサに取り組んでいたという事実のために私の場合は不可能だったので、私は自分自身を発明していた。

その答えは:なかった以上PGO C++での特典が気づ.

なお話をさせて頂きたいと思い: JIT エンジンランタイムの両方の瞑、欠点から開発者の眺望:その情報を実行時にはかなりの時間解析を行いました。一部の最適化本当に高価ですが見えない大きな影響を与える開始時間はひとり様:ループの巻き戻しが完了すると、自動ベクトル化(多くの場合もに基づくループの巻き戻しが完了する),命令の選択利用SSE4.1CPUを使用するSSE4.1)複合命令スケジュールを並べ替えを使いスーパースカラー Cpu).このような最適合とCコード(センティブC++から、javascriptの名前空間).

単一の本格コンパイラのコンピュータ-アーキテクチャは高度な編集とか)では、Java ホットスポット 作成とアーキテクチャと同様の原理を利用段階の作成(Java アズール'sシステム、人気の日 JaegerMonkey JSエンジン

その最大の最適化ランタイムは次の通りです:

多様なインラインキャッシュ (意味のことを行った場合、最初のループの一種、第二の時間のコードをループする専門る前のループは、 JIT それがガードをデフォルト支店inlinedの種類、およびそれに基づくこのことから専門書を使用 SSA形エンジンの適用定数の折りたたみ/伝播にinlining、デッド-コード消去最適化によって決まりの方"先進"の JIT がんの向上または下向上のCPUを登録しいです。 る場合がありますので、 JIT (ホットスポットが向上するのbranchyコードは、実行時情報を取得しよC++のコードが静的なコンパイラは、この側面に分析、並べ替え、簡単なループがあります。また、通常、C++のコード領域が必要な高速にくい傾向にOOPので、情報の JIT 最適化などの改善を図る。

もう一つの利点の JITs であること JIT 作品のクロスアセンブリなどの情報をいいinlining.

なお話をさせて頂きたいと思い:ということかと基底クラスです 一つだけ の実装で、Bは別パッケージ/組立/gemすることになりました。とが読み込まれます。

JIT で見ることBのみの実装で置き換えでこの内部表現の信-Bコードは、メソッドの呼び出しな派遣を見るvtable)が直接ます。その直接の電話できinlinedます。例えばこのB法: getLength() を返す2では、すべての通話の getLength() の減額を一定の2。終了時にはC++のコードはスキップできる仮想通話のB他dll.

一部の実装ではC++をサポートしていない最適化に渡します。cppファイル(今日でもあり、ltoフラグに最近のバージョン GCC ることもできます)。がの場合はC++開発者、関係者に速まれる、すべて感度の授業の静的ライブラリも、同じファイルをコンパイラでインラインでも、追加情報JITているように設計さまに提供する開発者自身でしていない損失です。

Visual Studioは、コードの最適化のために使用することができ、実行時プロファイリングを行うためのオプションがあります。

"プロファイルに基づく最適化"

のMicrosoft Visual Studioは、/ <この「プロファイルに基づく最適化を呼び出しますA> ";あなたは MSDN のでそれについての詳細を学ぶことができます。適切な最適化を得るために基本的に、あなたがプログラムにそのホットスポットおよび他の性能特性を記録するために、付属のプロファイラとの回の束を実行し、次にあなたがコンパイラにプロファイラの出力を供給することができます。

私は信じているこの一部を行うにしようとする LLVM。それはプログラムの全体寿命を横切って最適化しようとする(、リンク時に、コンパイル時と実行時)

合理的な疑問 - 。しかし、疑わしい前提と

ニルスの答えのように、時には 『最適化』は、独自の権利での素敵な主題である 『低レベルの最適化を』、を意味します。

しかし、それはそれは一般的に与えられた関連性の近くにどこにもありません「ホットスポット」の概念に基づいています。

定義:ホットスポットは、プロセスのプログラムカウンタがその時間の大部分を費やしているコードの小さな領域である

ホットスポットは、このようないないサードパーティ製で、すなわち(それはあなたがコントロールコードであれば、それは、低レベルで最適化しようとしている価値がある多くの時間を占有タイトなインナーループとして、存在する場合ライブラリ)。

これで内部ループは、関数の呼び出し、任意の関数が含まれていると。今、プログラムカウンタは、機能である可能性が高いので、そこに見つけられそうではありません。コードは無駄かもしれないがだから、それはもはやホットスポットではありません。

ホットスポットが1であるのソフトウェアが遅いようにする多くの一般的な方法があります。しかし、私の経験では、それはほとんどのプログラマが認識している唯一の、そして低レベルの最適化が適用される唯一のものです。

これを参照してください。こちら

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