先日、昼食をとりながら友人とニューラル ネットワーク (NN) について話し合っていたところ、彼は、Java で記述された NN のパフォーマンスは C++ で記述されたものと同様であると主張しました。「ジャスト イン タイム」コンパイラ技術を使用すると、Java が非常にうまく機能することはわかっていますが、どういうわけか私はそれを購入しません。この問題に光を当てる経験がある人はいますか? このページは、この件に関する私の読書の範囲です。
7 に答える
Hotspot JIT は、C++よりも高速にコードを生成できるようになりました。その理由は、実行時の経験的最適化です。
たとえば、特定のループが 99% の確率で「false」分岐を取り、それに応じてマシン コード命令を並べ替えることがわかります。
これに関する記事はたくさんあります。すべての詳細が必要な場合は、Sun の優れたホワイトペーパーをお読みください。より非公式な情報については、これを試してください。
HotspotJITとプロファイルガイド付き最適化最適化C++の比較に興味があります。
Hotspot JIT(およびランタイムプロファイルに最適化されたJITコンパイラ)で私が目にする問題は、統計を保持し、コードを変更する必要があることです。孤立したケースがありますが、これによりコードの実行が速くなりますが、ほとんどの状況で、プロファイルが最適化されたJITコンパイラが十分に最適化されたCまたはC++コードよりも高速に実行されるとは思えません。(もちろん、私は間違っている可能性があります。)
とにかく、通常、あなたはそれが書かれているのと同じ言語を使用して、より大きなプロジェクトに翻弄されるでしょう。あるいはあなたはあなたの同僚の知識ベースに翻弄されるでしょう。または、ターゲットとするプラットフォームに翻弄されることになります(ターゲットとするアーキテクチャでJVMを使用できますか?)。まれに、完全な自由があり、両方の言語に精通している場合は、自由に使用できるツールと比較してください。それが本当に何が最善かを判断する唯一の方法です。
唯一可能な答えは、プロトタイプを作成して自分で測定することです。私の経験に興味があるなら、Java と C# は、私が行っていた種類の作業では常に C++ よりもはるかに低速でした - 主にメモリ消費量が多いためだと思います。もちろん、まったく異なる結論に達することができます。
これは厳密にはC++とJavaのパフォーマンスに関するものではありませんが、それでもその点で興味深いものです。ガベージコレクション環境で実行されているプログラムのパフォーマンスに関する論文。
おそらくC++ですが、起動時間が遅いこと以外はほとんど違いに気付かないと思います. ただし、Java を使用すると、開発が迅速になり、保守が容易になります。
過度のガベージ コレクションが懸念される場合は、使用されていないチャーンの多いオブジェクトをいつでも再利用できます。
新しいオブジェクトを作成する前にそれらを使用して、リサイクルされたオブジェクトへの SoftReferences のキューを保持するファクトリを作成します。次に、これらのオブジェクトを使用するコードで、これらのオブジェクトを明示的にファクトリに戻してリサイクルします。
物事の壮大な計画では、CUDAまたは専用ハードウェアに移行することで数桁のパフォーマンスの違いが得られる可能性がある5%のパフォーマンスの違いについて議論しています。