4

こんにちはstackoverflowユーザー、これは私の最初の質問です。私の表現方法に誤りがある場合は、指摘してください、ありがとう

この単純な計算関数は、Java と C++ の両方で作成しました。

ジャワ:

long start = System.nanoTime();
long total = 0;
for (int i = 0; i < 2147483647; i++) {
    total += i;
}
System.out.println(total);
System.out.println(System.nanoTime() - start);

C++:

auto start = chrono::high_resolution_clock::now();
register long long total = 0;
for (register int i = 0; i < 2147483647; i++)
{
    total += i;
}
cout << total << endl;
auto finish = chrono::high_resolution_clock::now();
cout << chrono::duration_cast<chrono::nanoseconds>(finish - start).count() << endl;

ソフトウェア: - JDK8u11 - Microsoft Visual C++ コンパイラ (2013)

結果:

ジャワ: 2305843005992468481 1096361110

C++: 2305843005992468481 6544374300

計算結果は同じですが、出力されたナノ時間は、Java プログラムが 1 秒かかるのに対し、C++ では実行に 6 秒かかることを示しています。

私はかなり長い間 Java を使用していますが、C++ は初めてです。コードに問題はありますか? それとも単純な計算で C++ が Java よりも遅いのは事実ですか?

また、パフォーマンスが向上することを期待して、C++ コードで「登録」キーワードを使用しましたが、実行時間はまったく変わりません。誰かがこれを説明できますか?

編集: ここでの私の間違いは、C++ コンパイラの設定が最適化されておらず、出力が x32 に設定されていることです。/O2 WIN64 を適用して DEBUG を削除した後、プログラムの実行には 0.7 秒しかかかりませんでした

JDK はデフォルトで出力に最適化を適用しますが、デフォルトでコンパイル速度を優先する VC++ には当てはまりません。また、C++ コンパイラによって結果が異なります。コンパイル時にループの結果を計算するものもあり、実行時間が非常に短くなります (約 5 マイクロ秒)

注: 適切な条件が与えられれば、C++ プログラムはこの単純なテストで Java よりも優れたパフォーマンスを発揮しますが、多くの実行時の安全性チェックがスキップされ、「安全な言語」としてのデバッグの意図に違反していることに気付きました。境界チェックがないため、大規模な配列テスト

4

3 に答える 3

-1

C/C++ が常に Java よりも高速である理由を説明する最も簡単な方法は、Java の仕組みを理解することだと思います。

Java は当初から、クロスプラットフォーム ソフトウェアを容易にするために開発されてきました。Java が登場する前は、各マシン ファミリで個別にプログラムをコンパイルする必要がありました。現在でも、さまざまなハードウェア アーキテクチャ、受け入れられている標準、および OS が存在するため、このハードルを回避することはできません。Java は、コンパイラと JVM によってこれを実現します。コンパイラーは可能な限りの最適化を適用し、これを Java バイトコードにアセンブルします。これは、コンパイルされた最適化されたソースの省略形のようなものです。ただし、このバイトコードはまだプロセッサで理解できません。

ここで Java 仮想マシンの出番です。最初に、JVM は実行されている環境を特定し、適切な変換テーブルをロードします。次に、バイトコードが JVM に読み込まれ、各コードがテーブルで検索され、環境のネイティブ マシン コードに変換されてから実行されます。

ご存知のように、これにはすべての命令ごとにわずかな時間がかかります。しかし、コンパイルされた C/C++ プログラムでは、既に適切なマシン コードに含まれており、すぐに実行されます。

興味深い点 - すべての OS とほとんどのデバイス ドライバーは、パフォーマンス上の理由から C で記述されています。

于 2014-08-16T21:32:08.723 に答える