1

私は最小限に抑えたいかなり高価な配列計算 (SpectralResponse) を持っています。最良の方法は、それらを保存し、将来同じアレイが再び必要になったときに元に戻すことだと考えました。決定は、BasicParameters を使用して行われます。

そのため、現在、SpectralResponse の配列にはオブジェクトの LinkedList を使用し、BasicParameter には別の LinkedList を使用しています。また、BasicParameters には、パラメーター セットを比較する isParamsEqualTo(BasicParameters) メソッドがあります。

LinkedList<SpectralResponse> responses
LinkedList<BasicParameters> fitParams
LinkedList<Integer> responseNumbers

調べるには、BasicParameters のリストを調べて一致をチェックし、一致する場合は SpectralResponse を返します。一致しない場合は、SpectralResponse を計算します。

これは、検索に使用した for ループです。

size: LinkedList size, limited to a reasonable value
responseNumber: just another variable to distinguish the SpectralResponse.

    for ( i = size-1; i > 0 ; i--) {
        if (responseNumbers.get(i) == responseNum)
        {
            tempFit = fitParams.get(i);
            if (tempFit.isParamsEqualTo(fit))
            {
                return responses.get(i);
            }
        }
    }

しかし、どういうわけか、このようにすると大量のメモリが消費されるだけでなく、SpectralResponse を直接計算するよりも実際には遅くなります。はるかに遅い。

私の実装が間違っているのでしょうか、それとも事前計算とルックアップの方が速いと誤解していましたか?

4

4 に答える 4

4

インデックスでLinkedListにアクセスしていますが、これはアクセスするための最悪の方法です;)

代わりにArrayListを使用するか、すべてのリストにイテレータを使用する必要があります。

おそらく、3つのオブジェクトを1つにマージし、responseNumをキーとしてマップに保持する必要があります。

お役に立てれば!

于 2008-12-11T09:01:57.237 に答える
1

リンクリストではなく、配列タイプ(Vector、ArrayListなどの実際の配列)を使用する必要があります。リンクリストは、インデックス作成ではなく、スタックまたはキューの操作に最適です(一方の端からトラバースする必要があるため)。Vectorは自動サイズ変更配列であり、inexeにアクセスする際のオーバーヘッドが少なくなります。

于 2008-12-11T09:03:53.833 に答える
1

LinkedListのget(i)メソッドでは、各アイテムをフェッチするために、リストに沿ってさらに進む必要があります。ArrayList、iterator()メソッド、または単に配列を使用することを検討してください。

于 2008-12-11T09:06:12.563 に答える
0

2 行目 ' if (responseNumbers.get(i) == responseNum)' も がresponseNumbers.get(i)整数であるため非効率的であり、int にアンボックスする必要があります (Java 5 以降ではこれが自動的に行われます。responseNum が int として宣言されている場合、コードは Java 1.4 以前ではコンパイルされません)。 )。ボクシングの詳細については、こちらを参照してください。

このボックス化解除のオーバーヘッドを取り除くには、Apache プリミティブ ライブラリのIntListを使用します。このライブラリには、基になるオブジェクト (この場合は int) を Object 配列ではなくプリミティブ配列 (int[] など) として格納するコレクションが含まれています。これは、IntList のメソッドが整数ではなくプリミティブ型を返すため、ボックス化が必要ないことを意味します。

于 2008-12-17T22:11:55.117 に答える