2

Java と C++ で小さなテストを実行し、大量の非常に小さなオブジェクト (クラス メンバーはなく、コンストラクターには何もありません) を作成しましたが、Java は明らかに高速です (つまり、C++ は非常に遅いようです)。これはJVMに関係していると思いますが、どのように?

編集:

私が使用したクラスは、C++ で次のようなものでした (クラス メンバーがなく、コンストラクターで何も行われていないと言ったように)。

class foo{
    public:
        foo(){}
        ~foo(){}
}

そしてJavaで:

public class Foo{
    public Foo(){}
}

私が行った小さなテストは、大量のオブジェクトをループに割り当てることだけでした (約 1000000000 行で)。Linux を使用する同じマシンで、GCC 4.7.2 と Java 1.7 を OpenJDK 実装で使用しました。

確かに、JVM が不要なメモリを所有していることを示すメモリ プールの割り当てに関係していると思います。

JVM は実際にはポインター参照のカウントとメモリーの割り当てが遅くなると思っていたので、まだ混乱しています。

4

1 に答える 1

15

ヒープ上の多くの小さなオブジェクトの割り当ては、Java のランタイムが C++ (ほとんどの主流の実装) よりもすぐに最適化されることが多い状況の 1 つです。を使用して C++ でヒープ オブジェクトを割り当てるたびにnew、通常、実装によって OS へのシステム コールが行われます (少なくとも、Linux や Windows などのほとんどの主流プラットフォームでは)。Java では、通常、JVM によって提供されるメモリ プールから割り当てます。これは、ヒープ上に Java オブジェクトを割り当てるために特別に設計および最適化されています。

特別なメモリ プール アロケータを使用すると、ほとんどの状況で C++ の方が高速になる可能性があります。(また、C++ には、オブジェクトをスタックに割り当てるオプションがあり、もちろん、これよりもはるかに高速です。)

一般に、C++ を使用すると、プログラムがメモリを割り当てて管理する方法をよりきめ細かく制御できます。一方、JVM は、ヒープ割り当てオブジェクトとガベージ コレクションを必要とする実際の Java 言語仕様によって制約されます。しかし、ヒープ上に多数の小さなオブジェクトを割り当てる必要があるアプリケーションを C++ で作成している場合は、メモリ プール アロケータの使用を検討することをお勧めします。

于 2013-05-15T14:31:16.040 に答える