速度を向上させるために Java から C++ への自動変換を試みた人はいますか? 長期的にはメンテナンスの悪夢ですか?Gecko http://ejohn.org/blog/html-5-parsing/で HTML5 解析エンジンを生成するために使用されるものを読んでください。
7 に答える
一般に、ある言語から別の言語への自動変換は改善されません。言語が異なれば、パフォーマンスに影響を与えるイディオムも異なります。
最も簡単な例は、ループと変数の作成です。Java GCの世界では、newを使用したオブジェクトの作成はほとんど無料であり、オブジェクトは同じように簡単に忘却に飛び込みます。C ++では、メモリ割り当ては(一般的に)高価です:
// Sample java code
for ( int i = 0; i < 10000000; ++i )
{
String str = new String( "hi" ); // new is free, GC is almost free for young objects
}
C ++に直接変換すると、パフォーマンスが低下します(GCの代わりにTR1 shared_ptrをメモリハンドラーとして使用)。
for ( int i = 0; i < 10000000; ++i )
{
std::shared_ptr< std::string > str( new std::string( "hi" ) );
}
C++で記述された同等のループは次のようになります。
for ( int i = 0; i < 10000000; ++i )
{
std::string str( "hi" );
}
言語から別の言語への直接翻訳は、通常、両方の世界で最悪であり、コードの保守が困難になります。
言語の使用スタイルは非常に異なるため、無意識の変換はほとんど役に立ちません。インテリジェントコンバーターは、使用されるスタイルが異なるため、書き込みがほぼ不可能になります。
いくつかの問題領域:
- リソースの割り当ては、Javaでは「try {} finally {}」ブロックによって制御されますが、C++はRAIIを使用します。
- Javaは、コンパイル時のC++実行時に例外チェックを実行します。
- 例外の処理方法は異なります。2つの例外:
- Javaの場合(最後のスローが伝播されます)
- C++ではアプリケーションが終了しました。
- Javaには大規模な標準ライブラリがあります
。C++には、Webで検索するために必要な機能と同じ機能がすべて備わっています[これは面倒です]。 - Javaはすべてにポインタを使用します。
- 思いもよらない単純な変換では、shared_ptrオブジェクトだけで構成されるプログラムが残ります。
とにかくJITコンパイルJavaは速度がC++に匹敵します。
この変換の良い点は、Java から C++ (パラダイム インターセクション) に切り替えるには、適切なオブジェクト指向設計が必要になることです。
ただし、C++ をコーディングしても Java コードに比べて速度が向上しないという人もいます。
このタイプの変換シェルがより良いパフォーマンスにつながる可能性はほとんどありません. 通常、JVM が動作しているとき、ほとんどのコードがネイティブ マシン コードに変換されます。あなたが提案しているのは、Jave コードを C++ に変換し、そこからネイティブ マシン コードに変換することです。つまり、余分なフェーズを追加することです。ただし、次の事実により、いくらかの利益が達成される可能性があるいくつかの些細なケースがあります。
1) JVM を最初からロードするには時間がかかります。
2) Jit を実行するには時間がかかります。非常に短いプログラムを実行する場合、多くの場合、実行する前にこの時間を無駄にしたい場合があります。
3) サーバー モードで実行していない場合、Java で同じレベルのマシン コードを取得できない場合があります。(サーバー モードでは、最高のマシン コードを取得することが期待されます。また、実行時に検出される独自の CPU に最適なマシン コードを取得することが期待されます。これは通常、プログラムのほとんどの C/C++ 移植に欠けており、さらにマシン コード実行時に最適化されます)
Java の自動メモリ管理をプログラムによる手動メモリ管理に置き換えることはほとんど不可能です。そのため、メモリ リークのあるプログラムや、ガベージ コレクターを使用する C++ コードで終わる可能性が最も高いでしょう。ただし、Java のガベージ コレクターには依存するものがはるかに多いため (たとえば、ポインター演算がないなど)、C++ のガベージ コレクターを安全にするためにパフォーマンスが低下します。そのため、自動変換によってパフォーマンスが低下する可能性が高くなります。
代わりに、手動で C++ に移植するか、Java コードを最適化してください。
一般に、そのようなコンバーターについて言えば、コードを書く言語を理解している実際の人間が必要になるため、保守可能なコードや高性能なコードを生成することは期待できません。それらが非常に役立つのは、言語の移植を容易にすることです。たとえば、C へのコンバーターを備えた言語は、幅広い言語で迅速に実装できます。私は 90 年代半ばに f2c を使用して、Macintosh で Fortran ルーチンを実行しました。
C++ でコードを書き直した場合、パフォーマンスが向上する場合とされない場合があります。自動コンバーターを使用すると、おそらく速度が低下します。
それが機能したとしても、速度が大幅に向上するかどうかはわかりません。Java の Hotspot JIT コンパイラーは非常に優れたものになりました。