1

私は最近、ArrayList の "toArray() : Object[]" メソッドを発見しました。これを活用してパフォーマンスを向上させるべきかどうか疑問に思っています。

ArrayList が Object[] 配列よりもコストがかかることは知っていますが、自動的にサイズが変更されるため、もちろんより便利です。しかし、ArrayList を使用してオブジェクト リストを作成すると、より集中的なデータ操作を行うときに、それを Object[] 配列に変換できると思います。

ArrayList の構築が完了した後で、ArrayList を任意の配列 Object[] に変換するのは良い方法ですか? 200K オブジェクトの ArrayList をループして、それを別のオブジェクトの ArrayList と比較すると、時間がかかることがあります。パフォーマンス面でメリットがありますか?

4

3 に答える 3

3

まず第一に、パフォーマンスについて決して仮定を立てるべきではありません。あなたはそれを測定する必要があります。私は自分の「感覚」が間違っていることを証明しました。ArrayListvsのパフォーマンスはObject[]非常によく似ていると確信していました。initialCapacityset を使用ArrayListすると、配列の単純なラッパーになります。そして、これらのラッパー メソッドは、JVM によって確実にインライン化されます。

私が間違っていたことが判明しました。実数を取得する簡単なテストを作成しました。私のマシン(Oracle Java 7 64ビット、Linux)では、数字は次のとおりです。

ArrayList write: 105.8ms
String[]  write:  39.8ms

ArrayList read:   64.1ms
String[]  read:   40.9ms

そのArrayListため、 では約 100% 遅くなり、 ではset()50% 遅くなりますget()

それはオートボクシングが開始されていませんでした。また、 vsでテストを実行します。ArrayList<Integer>int[]

ArrayList<Integer> write: 2660.0ms
int[]              write:   27.5ms

ArrayList<Integer> read:    59.5ms
int[]              read:    20.2ms

String[]GC はテスト中に実行されませんでしたが、テスト中にint[]約 25 回実行されました。

ArrayListそれにもかかわらず、ソートするためだけにコピーするObject[]のは意味がありません:

14.98ms  Collections.sort(list)
15.32ms  Arrays.sort(list.toArray(new String[list.size()]));
于 2013-11-14T14:50:05.827 に答える
1

以前のアンサーを完成させるために、パフォーマンスが重要な場合は、 ArrayListの実際の実装を見て、最もよく使用する特定の操作を分析することもお勧めします。get 操作と set 操作のオーバーヘッドを確認できます (ここで、オーバーヘッドは型のジェネリック性、範囲チェック、および func 呼び出しによって引き起こされます)。これは、作業が悪化するかどうかを判断するのに役立ちます。(一般的な意見として、すべてを最適化するのではなく、本当に重要ないくつかのポイントのみを最適化してください)

于 2013-11-14T16:30:03.020 に答える