2016-08-27 4 views
-4

昨日this質問に私のリニア検索が最適化されました。戻り値が処理され、if文にロックされていても、コンパイラはリリース時に私のコードの一部を最適化します。

戻り値がはっきりと処理されていても、同じように動作するバイナリ検索が可能になりました。

void timeBinarySearch(std::vector<int>& primes) { 
    clock_t start, stop; 
    size_t NRND = 10000; // 10000 primes per seach 
    for (int N = 50000; N <= 500000; N += 50000) // alla mätpunkter 
    { 
     for (int repeat = 0; repeat < 5; repeat++) { 
      start = clock(); 

      for (int j = 0; j < NRND; j++) { 
       int ran = rand(); 
       int pos = binarySearch(primes, ran, N); // Handling the return value 
       if (pos != -1 && primes[pos] != ran){ // value of pos is requested here 
        std::cout << "Katastrof" << std::endl; 
       } 

      } 
      stop = clock(); 

      double timeTaken = (1.0*(stop - start))/CLOCKS_PER_SEC; 

     } 
    } 
} 

そしてbinarySearch機能:

私のバイナリ検索を呼び出すコードは以下の通りである

int binarySearch(std::vector<int>&primes, int number, int range) { 
    int max = range; 
    int min = 0; 
    while (min <= max) { 
     int mid = (min + max)/2; 
     if (primes[mid] == number) 
      return mid; 
     if (number < primes[mid]) 
      max = mid - 1; 
     else 
      min = mid + 1; 
    } 
    return -1; 
} 

上記はbinarySearchからの戻り値は、POSに保存しても、ために必要であることを示していますif文に続くそれはデバッグモードでの魅力のように動作しますが、コンパイラがバイナリ検索を最適化するように見えるリリース(私はリリースモードを取る時間が必要です)でリリースします。 binarySearch関数内の任意のブレークポイント状態

現在のブレークポイントはヒットしません。この行には、デバッガのターゲットコードタイプの実行可能コードは関連付けられていません。

リリースモードでデバッガをステップ実行しても、posを要求するif文で停止することはなく、おそらくこれも最適化します。

私は昨日の質問と同様の問題を抱えていますが、今回は戻り値が処理されます。

最小10 000 *ログ(50 000)の複雑さと最大で10 000 *ログ(500 000)の実行時間が0msと見なされるため、バイナリ検索を実行している時間を取得できません。実行には0ms以上かかることがあります。

+0

最適化フラグはどのオペレーティングシステムですか?どのように時間を測定していますか? –

+0

リリースモードでデバッグしますか? – LogicStuff

+1

入力データを含む[mcve]を投稿してください –

答えて

2

非常におおよその概算では、あなたの検索はたったの50万命令です。プロセッサがサイクルあたり1命令(1GHz)で実行されている場合(最新のプロセッサでは完全に不正確ですが、コンピュータがどれ程速いかを知るには十分近い)、0.5msで500,000命令が実行されます。あなたはおそらくこれよりも速くループしているでしょう。

+0

*現在のブレークポイントはヒットしません。この行には、デバッガのターゲットコードタイプの実行可能コードは関連付けられていません。 * この質問の鍵です。 –

関連する問題