言語にはスピードがありません。Java や C++ の言語仕様では、「プログラムはこのように効率的にコンパイルする必要があります」とは指定されていません。
各言語は、プログラムが実行しなければならないこと、または少なくとも実行するように見えることのリストを指定します。これにより、プログラムの効率に上限が設定される場合がありますが、多くの場合、賢いコンパイラは個々のプログラムでこれらの規則を無視できます。重要なのは、あたかも仕様に従っているかのようにプログラムが動作することだけだからです。関数をインライン化したり、ヒープ データをスタックに移動したりできます。
プログラムのパフォーマンスは、コンパイラ、基盤となるプラットフォーム/ハードウェア、およびプログラム コード自体の 3 つに依存します。
「言語」ではありません。最も近いのはコンパイラです。
いずれかの言語が他方よりも高速になるのには十分な理由があります。C++ は、プログラムの実行を遅くする可能性のある約束をあまりしませんが、Java は JIT されています。つまり、ランタイム情報を利用してコードを最適化できる可能性があります。これは、C++ では簡単に実行できません...仕様には、C++ をjitしてはいけないと書かれています。私が思うに、JVM バイトコードの代わりにネイティブ コードを生成する Java コンパイラもあると思います。
あなたの質問は、実行している特定のコンピューター、各言語の特定のコンパイラ、および各言語でのプログラムの特定の実装がある場合にのみ意味があります。
ガベージ コレクションも素晴らしい例です。もちろん、ガベージ コレクションにはある程度のオーバーヘッドが伴いますが、いくつかの重要なショートカットも可能になります。Java や .NET などのマネージ言語では、ヒープ割り当ては、マネージされガベージ コレクションされるため、非常に安価です。C++ では、もちろん指定されていませんが、実際には、OS が多かれ少なかれ断片化されたメモリ空間でメモリの空きブロックを見つけるためにヒープを走査する必要があるため、通常は非常に低速です。どれが一番速いですか? OSに依存します。コンパイラに依存します。ソースコードに依存します。
ソースコードにも大きな違いがあります。Java プログラムを単純に C++ に移植した場合、それはがらくたのように動作します。C++ は仮想関数をうまく処理できず、通常は代わりに使用できる優れた代替手段を利用できます。C++ ではヒープの割り当てが非常に遅くなる可能性があるため、単純に Java プログラムを再実装するのは非常に非効率的です。また、反対方向に進む場合も同様です。Java に直接移植すると、多くの C++ イディオムが不必要に遅くなります。では、1 つのプラットフォームと 1 つのコンパイラーに落ち着いたとしても、プログラムのパフォーマンスをどのように比較しますか? コンパイラーに渡すためにも、その実装を 2 つ作成する必要があり、それはもはや同じプログラムではありません。
しかし、ほとんどの最新のハードウェアでは、最新の Java コンパイラーと最新の C++ コンパイラーを使用して、ほとんどのプログラムを非常に効率的に実装でき、十分に高速であると言っても過言ではありません。ただし、使用している言語を理解し、そのルールに従ってプレイする場合に限ります。C++ で Java コードを書こうとすると、魔法のように Java の方がはるかに効率的であることが判明し、逆もまた同様です。
あなたの質問に対する最も簡潔な答えは、「いいえ。C++ と Java のパフォーマンスの違いを定量化できる人はいません」だと思います ;)