0

かなり大きなプロジェクトに取り組むのは初めてで、最高のパフォーマンスを求められました。

約 5000 の要素を持つリストListIteratorを呼び出す約 180 のループがあるため、for ループを に置き換える必要があります。list.get(i)

そこで、質問が 2 つあります。

1) これらの 2 つのスニペットは同じですか? つまり、それらは同じ出力を生成しますか? いいえの場合、どうすれば修正できますListIteratorか?

ListIterator<Corsa> ridesIterator = rides.listIterator();
    while (ridesIterator.hasNext()) {
        ridesIterator.next();
        Corsa previous = ridesIterator.previous(); //rides.get(i-1)
        Corsa current = ridesIterator.next(); //rides.get(i)
        if (current.getOP() < d.getFFP() && previous.getOA() > d.getIP() && current.wait(previous) > DP) {
            doSomething();
            break;
        }
    }

__

for (int i = 1; i < rides.size(); i++) {
    if (rides.get(i).getOP() < d.getFP() && rides.get(i - 1).getOA() > d.getIP() && rides.get(i).getOP() - rides.get(i - 1).getOA() > DP) {
        doSomething();
            break;
        }
    }

2) このようなものがある場合、どのように最初のスニペットになりますか? (i とその終了条件を変更)

for (int i = 0; i < rides.size() - 1; i++) {
    if (rides.get(i).getOP() < d.getFP() && rides.get(i + 1).getOA() > d.getIP() && rides.get(i).getOP() - rides.get(i + 1).getOA() > DP) {
        doSomething();
            break;
        }
    }

を使うのは初めてで、ListIterator今は試すことができないので質問しています。

編集:私は ArrayList を使用していません。これは、LinkedList に基づくカスタム リストです。

EDIT 2:さらに情報を追加しています。私のデータは反復ごとに変化し、一貫性のないデータを処理する必要があるため、キャッシュの管理が難しいため、キャッシュシステムを使用できません。このループのいくつかを 1 つの大きなループにマージすることさえできません。さまざまなことを行う必要があるため、さまざまな方法でそれらを取得しているためです。

では、この特定のケースに固執すると、最善の方法は何だと思いますか? ListIterator は私のケースに対処するための最良の方法ですか? for ループが 0 と size-1 の間で機能する場合、ListIterator をどのように使用できますか?

4

3 に答える 3

1

最大サイズがわかっている場合は、コレクションArrayListを単純な配列に置き換えるなど、コレクションを辞めると最高のパフォーマンスが得られます。

したがってArrayList<Corsa>、5000個の要素で作成する代わりに、を実行しますCorsa[] rides = new Corsa[5000]。ハードコーディングする代わりに、たとえば、コード内のマジックナンバー5000を避けるためにそれを使用します。次に、を参照して、通常のforで繰り返します。final static int MAX_RIDES = 5000rides[i]

一般に、パフォーマンスを求める場合は、C / C ++であるかのように(もちろん可能な場合は)Javaでコーディングする必要があります。コードはそれほどオブジェクト指向で美しくはありませんが、高速です。最後に常に最適化を行うことを忘れないでください。確信がある場合は、ボトルネックが見つかります。そうでなければ、あなたの努力は無駄になり、コードが読みにくくなり、保守しにくくなるだけです。また、プロファイラーを使用して、変更が実際にダウングレードではなくアップグレードであることを確認します。

使用のもう1つの欠点はListIterator、内部でメモリを割り当てることです。そのため、GC(ガベージコレクター)はより頻繁に起動し、全体的なパフォーマンスにも影響を与える可能性があります。

于 2012-12-01T20:39:54.470 に答える