0

クラスのインスタンスの大きな配列を使用している Java プログラムを開発しています。配列のすべてのオブジェクトに対して計算を行う必要があります (クラス メソッドを使用)。Arrays.Sort またはその他のメソッドを使用して配列を注文すると、計算を実行するための計算時間が増加していることに気付きました。

Arrays.sort 関数にコメントを付けると、他の計算の前の計算時間は約 1 ~ 2 ミリ秒ですが、コメントを外すと 5 ~ 6 ミリ秒に増加します。

膨大な数のステップ (300,000 も) に対してこの作業を行う必要があるため、増分によってパフォーマンスが大きく変化します。

この奇妙な動作について何か説明はありますか?

4

2 に答える 2

5

コードについて私がほとんど知らないことを考えると、これが私の最善の推測です。

オブジェクトは通常、常にではありませんが、大まかに割り当てられた順序でヒープに配置されます。GC はそれらを移動しますが、順序が大まかに保持される可能性があります。

次に、順番にアクセスしてデータの計算を行うと、ほぼ線形のメモリ アクセスになる可能性があります。さらに重要なことは、ある程度予測可能なメモリアクセスです。これにより、CPU キャッシュとメモリ サブシステムの効率が向上します。

オブジェクトがソートされた順序で割り当てられていない場合に、それらをソートすると、ある程度予測可能なメモリ アクセスが予測不可能なランダム アクセスに変わり、速度が低下します。

于 2013-06-26T15:27:47.800 に答える
0

正確に何をしているのか教えていただけますか。実際、これは通常の配列であり、要素へのアクセスは CONST 時間です。

次のシナリオを見てみましょう。ソートされていない注文を見てみましょう。あなたは要素 'i' にいて、u は 'for loop' で他の要素を検索しています。この要素がインデックス 'i+1' にある場合、これには 1 ステップしかかかりません。次に、ソートされたリストを見てみましょう。あなたが探しているのと同じ要素は i+1 ではなく、別の場所にあるため、計算が遅くなります。これは、コードがわからないので、推測にすぎないと言いたいです。それはすべて、計算で正確に何をしているかに依存します。

于 2013-06-26T15:35:57.653 に答える