昨日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以上かかることがあります。
最適化フラグはどのオペレーティングシステムですか?どのように時間を測定していますか? –
リリースモードでデバッグしますか? – LogicStuff
入力データを含む[mcve]を投稿してください –