2012-02-25 9 views
1

私は、2つの異なる検索アルゴリズム(シーケンシャルとバイナリ)の時間を測定する必要がある割り当てを行っています(効率についてのポイントを作っていると思います)。私は約280語の検索対象のリストと約1200語の検索プールのリストを持っています。私は両方のファイルを読み込み、ArrayListsに単語を格納しました。ここで私の検索時間が短くなるのはなぜですか?

は、私がこれまで実施してきたシーケンシャルなアルゴリズムに関連するビットです。この後

long startTime = System.nanoTime(); 

//search sorted list for as long as end of list has not been reached and 
//current list item lexicographically precedes target String  
while((compareResult > 0)&&(position != searchPool.size()-1)){ 

    //update to current position 
    position += 1; 

    compareResult = target.compareTo(searchPool.get((int)position)); 

    comparisonCount += 1; 

}//end while loop 


long endTime = System.nanoTime(); 

timeElapsed = endTime - startTime; //timeElapsed also a long 

が、私はミリ秒単位で(作られた比較の数と経過時間を表示するので、私はで割ますよ最初の100万人)。

最初の数え方で返される時間は、約0.5〜0.7 msです。この数は32ワードに向かって揺らぎ、0.1ミリ秒かかる。残りの150語はすべて0.0ミリ秒かかります。

私は、比較回数と経過時間との間に直接の相関があると予想していました。どんなアイデアが間違っているのでしょうか?

脇に:compareToメソッド(つまり単語の長さ)によって行われた比較の回数は、時間に影響を与えているかもしれませんが、検索されたリストには表示されない長い単語その結論に達する前にすべての項目に達する)彼らはさらに下に表示されているすべての時間がかかりません。

+1

「java -version」と入力すると、何が表示されますか?ホットスポットやサーバービルドについて何か言えば、ホットスポットはAKJのように頻繁に実行されるコードを最適化しているということです。 – Bill

+0

これはあなたの意味ですか? Javaバージョン "1.6.0_23" OpenJDKランタイム環境(IcedTea6 1.11pre)(6b23〜pre11-0ubuntu1.11.10.2) OpenJDKサーバーVM(ビルド20.0-b11、混合モード) –

+0

はい、それです。 – Bill

答えて

2

JVMは頻繁に実行されるコードパスを最適化し、より高速になるようにします。また、最初の数回の反復では、接続の確立、リソースのロードなどが必要になる場合があります。

したがって、最初の数個のサンプルを破棄する必要があります。より信頼性の高い結果を得るには、より大きなサンプルで平均として測定します。

+0

説明をありがとう!うーん、それは問題を混乱させます。なぜなら、私がシーケンシャルで得た平均が0.0ミリ秒であれば、バイナリがシーケンシャルサーチよりも効率的であることを実証する方法がわからないからです。私は私の講師との課題について私の理解を確認しなければならないかもしれません。 –

+0

多くの操作では1ミリ秒以下の時間がかかりますので、1000回程度のバッチで実行し、1000回実行した時間または同様の数値を測定できます。また、ナノ秒単位で値を比較することもできます。 –

関連する問題