2 つの通話を並べて、測定可能な最小の継続時間を決定すると、次のようになります。
// g++ -std=c++11 -O3 -Wall test.cpp
#include <chrono>
typedef std::chrono::high_resolution_clock hrc;
hrc::time_point start = hrc::now();
hrc::time_point end = hrc::now();
std::chrono::nanoseconds duration = end - start;
std::cout << "duration: " << duration.count() << " ns" << std::endl;
これをループで何千回も実行しましたが、特定の 3.40GHz デスクトップで一貫して 40 ns +/- 2 ns を得ています。
しかし、私が眠れる最短時間はどれくらいかを調べてみると、次のようになります。
#include <thread>
hrc::time_point start = hrc::now();
std::this_thread::sleep_for( std::chrono::nanoseconds(1) );
hrc::time_point end = hrc::now();
std::chrono::nanoseconds duration = end - start;
std::cout << "slept for: " << duration.count() << " ns" << std::endl;
これは、私が平均して 55400 ナノ秒、つまり 55.4 マイクロ秒眠ったことを示しています。思っていたよりもずっと長い時間。
上記のコードをfor()
ループに入れて、さまざまな量でスリープしてみました。結果は次のとおりです。
- sleep_for( 4000 ns ) => 58000 ns スリープ状態
- sleep_for( 3000 ns ) => 57000 ns スリープ
- sleep_for( 2000 ns ) => 56000 ns スリープ
- sleep_for( 1000 ns ) => 55000 ns スリープ
- sleep_for( 0 ns ) => 54000 ns スリープ
- sleep_for( -1000 ns ) => 313 ns スリープ
- sleep_for( -2000 ns ) => 203 ns スリープ
- sleep_for( -3000 ns ) => 215 ns スリープ
- sleep_for( -4000 ns ) => 221 ns スリープ
私が持っているいくつかの質問:
- これらの数字を説明できるものは何ですか?
- 負の時間スリープすると 200+ ns が返されるのに、0+ ナノ秒でスリープすると 50,000+ ナノ秒になるのはなぜですか?
- スリープ時間としての負の数は文書化/サポートされている機能ですか、それとも信頼できない奇妙なバグに偶然出くわしたのですか?
- より一貫した/予測可能なスリープ時間を提供する、より優れた C++ スリープ コールはありますか?