ArrayList vs Arrayのプリミティブタイプのラッパー
-
14-10-2019 - |
質問
「Core Java 1」で読みました
注意:各値はオブジェクト内に個別にラップされているため、ArrayListはINT []アレイよりもはるかに効率的ではありません。プログラマーの利便性が効率よりも重要である場合にのみ、このコンストラクトを小さなコレクションに使用することをお勧めします。
しかし、私のソフトウェアでは、いくつかの要件のために通常の配列の代わりにArrayListを既に使用していましたが、「ソフトウェアは高性能であると想定されており、引用されたテキストを読んだ後、パニックになり始めました!」私が変更できることの1つは、自動ボクシングを防ぐために二重変数を2倍に変更することです。次のサンプルアルゴリズムでは、それが価値があるかどうかはわかりません
public void multiply(final double val)
{
final int rows = getSize1();
final int cols = getSize2();
for (int i = 0; i < rows; i++)
{
for (int j = 0; j < cols; j++)
{
this.get(i).set(j, this.get(i).get(j) * val);
}
}
}
私の質問は、ダブルにダブルに変更することは違いを生むことですか?または、それは何にも影響しないマイクロオプティミングですか?私は大きなマトリックスを使用しているかもしれないかもしれないことに留意してください。2ndプログラム全体をもう一度再設計することを検討する必要がありますか?
解決
の大きな問題 double
対 Double
後者は、ある程度のメモリオーバーヘッドを追加します - 太陽32ビットJVMのオブジェクトごとに8バイト、おそらく他のものに多かれ少なかれ。次に、オブジェクトを参照するには、さらに4バイト(64ビットJVMで8)が必要です。
したがって、1,000,000個のオブジェクトがあると仮定すると、違いは次のとおりです。
double[1000000]
エントリごとに8バイト。合計= 8,000,000バイト
Double[1000000]
オブジェクトあたり16バイトインスタンス +参照ごとに4バイト。合計= 20,000,000バイト
これが重要かどうかは、アプリケーションに大きく依存します。あなたが自分自身が記憶を使い果たしていないことに気付かない限り、それが問題ではないと仮定してください。
他のヒント
オートボクシングが発生する場所を変えますが、他には何も変わりません。
そして2番目 - いいえ、これについて心配しないでください。ボトルネックになることはまずありません。いくつかのベンチマークを作成して、データのサイズを測定して、アプリケーションのパフォーマンスに関して違いが重要ではないことを証明できます。
ダブルはダブルよりも劇的に高価ですが、90%のケースでは問題ではありません。
効率的なマトリックスクラスが必要な場合は、すでにこれを効率的に行っているライブラリの1つを使用することをお勧めします。たとえば、ジャマ。
変更 double
イントへの議論 Double
それはあまり役に立ちません。乗算のためにボックス化する必要があるため、パフォーマンスがわずかに悪化します。
役立つのは、複数の呼び出しを防ぐことです get()
のように:
for (int i = 0; i < rows; i++)
{
List row = this.get(i);
for (int j = 0; j < cols; j++)
{
row.set(j, row.get(j) * val);
}
}
(ところで、私は行のタイプを推測しました。)
リストのリストを使用していると仮定すると、ループインデックスを介して入手して設定する代わりにイテレーターを使用すると、さらにパフォーマンスが獲得されます。