Vector
をセットとして使用しようとしていて、レコードを追加する前にレコードの存在をチェックしている場合、ベクトルの塗りつぶしは O(n) と比較して O(n^2) 操作になりHashSet
ます。各要素をベクトルの最後ではなく最初に挿入すると、O(n^2) 操作にもなります。
使用しているだけなら、そのような違いは見られないと思いcollection.add(item)
ます-同期はそれほど遅くありません.
さまざまな数のレコードでテストを試みることができれば、n が増加するにつれて各バージョンがどのように成長するかを確認できます。これにより、何が起こっているのかを簡単に理解できるようになります。
編集: 使用しているだけの場合はVector.add
、何か他のことが起こっている可能性があります。たとえば、データベースは、異なるテスト実行間で異なる動作をしていました。ここに小さなテストアプリケーションがあります:
import java.util.*;
public class Test {
public static void main(String[] args) {
long start = System.currentTimeMillis();
Vector<String> vector = new Vector<String>();
for (int i = 0; i < 300000; i++) {
vector.add("dummy value");
}
long end = System.currentTimeMillis();
System.out.println("Time taken: " + (end - start) + "ms");
}
}
出力:
所要時間: 38ms
明らかに、これはあまり正確System.currentTimeMillis
ではありません - 正確なタイミングを得るための最良の方法ではありません - しかし、45分もかからないことは明らかです. 言い換えれば、本当にを呼び出しているだけなら、別の場所で問題を探す必要がありますVector.add(item)
。
ここで、上記のコードを使用するように変更します
vector.add(0, "dummy value"); // Insert item at the beginning
38 ミリ秒ではなく42秒かかります。これは明らかにかなり悪いですが、それでも 45 分にはほど遠いです。また、私のデスクトップがあなたのデスクトップの 60 倍速いとは思えません。