2012-01-30 16 views
1

バッチオブジェクトを一括して割り当てる方法はありますか?バッチオブジェクトの割り当てJava

私は次のコードの遅い部分を持って、それが速いようにしたい:

final int N = 10000000; 
Node[] a = new Node[N]; 
for (int i = 0; i < N; ++i) { 
    a[i] = new Node(-1, null); 
} 

私はすぐに仕事をすることができます(配列のために利用可能なもののような)いくつかの低レベルの方法があることを望んでいます。

+0

どのくらい速いですか、どのくらい速く必要ですか?それは速いですか? –

+0

このコードはボトルネックであることは何を示唆していますか?任意のプロファイラデータを提供できますか? –

答えて

0

ノードの所有者には何か面白いことがありますか?

Javaは、メモリを割り当てるためのオーバーヘッドが低いです。 GCが稼動しているときに、そのほとんどを支払うことになります。

+0

面白いことはありません。引数はフィールドに割り当てられます。 – dsg

+0

@AVDが述べているように、Javaには何も組み込まれていません。オブジェクトのスタック割り当ての概念はありません(C++のように)。おそらく、ステートレスであればNodeオブジェクトを共有できますか? – seand

2

いいえ!言語には組み込み機能はありません。 new構成を使用して割り当てると、objectが割り当てられます。

1

どのくらいが大きいですかNode?それは長い生き物ですか?このコードが遅い理由は、おそらくGCにぶつかっているからです。このコードをプロファイラで実行し、プログラムがGCで費やした時間を確認します。できることはヒープサイズを大きくし、生存スペースを0に設定することで、生存スペース間でコピーされることなくオブジェクトが若い世代のテナントスペースに直接移動するようにします。このような割り当てが頻繁に行われる場合は、若い世代の割合を増やすことで、すべてがすぐにそこに収まるようにします。 GCのチューニングについて

より多くの情報:http://www.oracle.com/technetwork/java/javase/gc-tuning-6-140523.html

EDITあなたが持っている必要がありますどのくらいのメモリの見積もりを与える - 配列自体は、すべてのノードのサイズが何であれ、約40メガバイトで、最低80 MBから開始します(各オブジェクトには8バイトのオーバーヘッドとフィールドのサイズがあります)。 64ビットJVMを使用している場合は、これらの数値を簡単に2倍にすることができます。