3

メカニズムが実際に機能していることを100%確信していないので、さらに明確にするためにここに投稿することにしました。

私はJavaで大量のデータを処理する必要があるプロジェクトを行っています(Javaである必要があります)。できるだけ効率的にしたいと思います。効率的とは、メモリと速度の計算が最初に来て、読みやすさが次に来るべきであることを意味します。

これで、データを保存する2つの方法があります。1つの配列を作成します。MyObject

1) MyObject[][] V = new MyObject[m][n]

または、intの2つの配列を作成します。

2) int[][] V = new int[m][n]

3) int[][] P = new int[m][n]

明らかMyObjectに、少なくとも2つのフィールドといくつかのメソッドが含まれています。MyObjectここで、配列をループして値を割り当てるときに呼び出す必要があることに気付きましたnew。そうしないと、nullポインター例外が発生します。これは、new1行目では不十分だったことを意味します。P[i][j]=n配列もJavaのオブジェクトであることを考えると、これは議論のために、よりも費用のかかる操作ですか?

4

4 に答える 4

4

プロファイリングを通じて、オブジェクトの配列をスカラーのいくつかの配列に置き換えると、メモリの消費とパフォーマンスが向上することがよくわかりました。

ただし、プロファイリングだけが、それがあなたのケースで価値のある最適化であるかどうかを判断できます。

優れたプロファイラーを使用すると、コードのパフォーマンスとメモリフットプリントの両方を測定できます。

于 2013-03-23T10:45:50.890 に答える
2

配列もJavaのオブジェクトであることを考えると、これは議論のためにP [i] [j] = nよりも費用のかかる操作ですか?

最初のケースでは、配列型の他のオブジェクトを格納する配列オブジェクトを作成します。配列オブジェクトと配列に格納されるオブジェクトの両方をインスタンス化する必要があります。つまり、m * n + 1オブジェクトのインスタンス化と(m * n + 1) * objectSizeメモリ消費が必要になります。

2番目のケースでは、配列オブジェクトをインスタンス化するだけで済みます。intプリミティブはオブジェクトではないので、オブジェクトのメモリサイズはintの数倍であるため、これはより高速でメモリ効率も高くなります。ここでは、基本的に1つのオブジェクトのインスタンス化と(m * n) * intSize + objectSizeメモリ消費があります。

プリミティブを使用するもう1つの理由は、ローカル変数として使用すると、それらがスタックに保持されるという事実です。計算値を配列に格納する前に、メソッド内で中間ローカル変数を使用する可能性があります。これらの変数のメモリの割り当て/割り当て解除時間は、ヒープ上にあるオブジェクトの時間の数倍です。

于 2013-03-23T10:54:30.103 に答える
1

本当に大量のデータを高速に処理するには、一緒にアクセスするデータが互いに近くなるように、データを単一の連続したメモリブロックに配置することをお勧めします。これにより、今日の最悪のパフォーマンスキラーの1つであるキャッシュミスを最小限に抑えることができます。

Javaでは、プリミティブの単一の1次元配列のみを使用してこれを実現します。2つの配列、または2次元の配列を使用する場合、データが1つの連続したブロックにあることが保証されなくなります。

もう少し複雑な解決策は、次のようなオフヒープデータ構造を使用することです:http://mechanical-sympathy.blogspot.com/2012/10/compact-off-heap-structurestuples-in.html

于 2013-03-24T09:09:35.837 に答える
0

まず、配列ではなくJavaでListまたはSetieCollectionsを使用する必要があります。処理する必要のあるデータのサイズがわからない場合があるためです。さらに、コレクションには、要素の挿入や削除などの操作を簡単に実行できるAPIメソッドがあります。配列の操作は非常に複雑でエラーが発生しやすくなります。これは、配列を何度も繰り返す必要があり、コンパイル時にサイズを決定する必要があるためです。これは、可変サイズのデータ​​がある場合は不可能です。

また、実行時にメモリを割り当てる(つまり、新しいキーワードを使用する)にはコストがかかり、既存のオブジェクトに値を割り当てるだけです。つまり、p [i] [j] = v;

于 2013-03-23T10:44:59.830 に答える