2012-02-29 19 views
5

C#およびJavaなどのJITed言語を優先する引数は、仮想マシンによる実行時プロファイリングにより、C++の静的に最適化されたコードよりもコードを最適化できるためです。パフォーマンスを最適化するためのC++用仮想マシン

しかし私は、仮想マシンを使用して、実行時にC++や他の同様の言語のコードを最適化できるかどうか疑問に思っていました。たとえば、LLVMコンパイラによって生成されたIRを受け取り、JavaやC#の場合と同様に、解釈、JIT、コードの最適化を行う仮想マシンを作成することができます。

もちろん、ガベージコレクションはありませんが、最適化要因はそこにあります。誰かがこれに取り組んだのですか?これに論文やツールはありますか?このアプローチはどれくらい効果的でしょうか?

+3

[Googleが "Clang" + "JIT"](https://www.google.com/search?q=clang+jit)を検索すると、多くの情報が取り込まれます。 – ruakh

+1

ChromeはChromeを更新するときに面白いことをします...プログラムは部分的に逆コンパイルされ、やや象徴的な形式が得られ、その形式へのパッチとして適用されてコンパイルされます。また、人々は実行時に自分自身を書き換える多態的なプログラムを書いていました(例えば、 'if'条件が決して偽でないことを検出すると、単に命令を' nop'で置き換えます)。したがって、これが実現可能ではない理由はありません。私はそれが事実であることを知っているので、「可能」とは言いません。 –

+0

実際に最適化することはできますが、最適化はできません。 –

答えて

2

理論的には、はい、JITはC++用に作成することができます。積極的にコードを最適化するために、基礎となるアーキテクチャのいくつかの利点を活用することができます。また、実行時にアプリケーションの読み込みに時間がかかるという欠点もあります。

勿論、そこには、ガベージコレクション、したがって、それが原因 オーバーヘッドもないだろうが、最適化の要因が存在することになります。 誰もがこれに取り組んでいます。これに論文やツールはありますか?どのように良い このアプローチになりますか?

ここでは大きな誤解があります。すべてのユーザー定義型に対してボード全体にGCを適用することは大きなオーバーヘッドです。最初に管理対象VMだけを使用しようとしているにもかかわらず、Android、iOS、Windows Mobileがすべて高性能アプリケーション向けにC/C++に移行した理由の1つです。

間接参照の追加レベルは、GCがコンパクトメモリのように自由であることを意味しますが、最適化されたC/C++プログラムは既に圧縮されたメモリを最初から使用しています。また、メモリが最初に断片化されていることも意味します。これは、C++が優れているような高性能アプリケーション(ビデオ処理、レイトレーシング、オーディオなどの大規模で連続したバッファを扱うもの)処理)。

また、すべてのUDTインスタンスを参照にするということは、すべてがヒープ上にあることを意味します。これは、もともと数クロックサイクルの操作を効果的に数百に変えています。

あなたの疑問にお答えするには、確かにC++コードをJITを使用して構築することができますが、静的な性質人々は一般的にC++コードを扱います。

+1

「ガーベジコレクションがないので、それに伴うオーバーヘッドはありません」と言いますと、ガベージコレクションがないため、オーバーヘッドが少なくなると言います。あなたはそれを他の方法で読む:)! – MetallicPriest

+0

@MetallicPriestああ私の悪いところは、文章は、GCの不足のためにオーバーヘッドが伴うことを意味すると思った。私はC#/ Java愛好家によく慣れていますが、GCが何とかしてもっと速くなると主張することがよくあります。 C++では、ユーザー定義型の連続したコンパクトな配列を作成するだけで、なぜこれを最初から実行する必要があるのか​​疑問に思っています。行列)を最初から右に移動します。 – stinky472

4

LLVMにはJITコンパイラlliが含まれており、Clangは既にC++からビットコードを生成できます。私はそれを試していないが、私はあなたが生成されたビットコードファイル(どこにリンクするC + +のlibファイルを見つける必要があります)と実行時にJIT C + +でlliを使用することができますと仮定します。 libC++をビットコードとしてビルドすることもできるので、JITできます。

Googleのネイティブクライアントには、サブプロジェクトであるポータブルネイティブクライアントがあります。ここでは、LLVM IRがクライアントに送信され、x86バイナリではなくクライアントに送信されると思います。

7

これは欠陥のある議論です。はい、仮想マシンにはより多くの情報がありますが、コンパイラに比べて時間と空間が大幅に少なくて済みます。

また、本当にしたい場合は、はい、絶対にできます。しかし、誰もしないので、一般的には起こっていません。少なくとも、最適化の理由ではなく、サンドボックス化のために行うこともできます。

+1

Clangのように、C++をバイトコードにプリコンパイルすることができます。この時点で、すでに多くの最適化を行うことができます。 – Xeo

+1

@ Xeo:理論的にはそうです。しかし、C/C++オプティマイザはかなり古く(コンピュータ用語で)、比較的良い仕事をしています。したがって、余分なパフォーマンスの向上はごくわずかです。誰かがそれについての論文を出版しているのを見てうれしいです。 –

関連する問題