2016-08-12 10 views
1

ここには低いレベルの質問があります。 CPU使用量がシステム時間をどのように獲得していますか?どのくらい集中的に時間がかかりますか?

時間の源は何ですか?私はbiosチップ上にハードウェアクロックがあることを知っているが、私はCPUとRAMの外部からデータを取得するためには、CPUが独自のクロックを持っているかもしれないと思っている読み込みを遅らせるかもしれないハードウェアの同期が必要になると思っている。どうか私が間違っているならば、私を修正してください。

時間がかかりすぎると、システム関数呼び出しが多かったり、使用されているプログラミング言語に依存したりしていますか?私はちょうどC++プログラムを使用して、それをテストしている

+0

時間がミリ秒に、さらにはナノ秒の分解能までプロファイルするのに使用されているので、オーバーヘッドは無視できると思います。 – bolov

+0

うん、オーバーヘッドはごくわずかです。ここで時間を取得する方法は多かれ少なかれトレースされています:http://stackoverflow.com/a/38916054/357403 – Koshinae

答えて

2

clock_t started = clock(); 
clock_t endClock = started + CLOCKS_PER_SEC; 
long itera = 0; 

for (; clock() < endClock; itera++) 
{ 
} 

は私が毎秒約2300万の反復する(Windows 7、32ビット、Visual Studioの2015年、2.6 GHzのCPU)を取得します。あなたの質問の点では、私はこの集中的に呼ぶことはありません。 デバッグモードでは、1秒間に1800万回の繰り返しを測定しました。

時間がローカライズされたタイムスタンプに変換される場合、複雑なカレンダー計算(タイムゾーン、夏時間など)はループを大幅に遅くする可能性があります。

clock()コール内で何が起こっているかを知ることは容易ではありません。私のシステムでは、QueryPerfomanceCounterが呼び出されますが、これはhereのように他のシステム関数にも繰り返されます。


チューニング

さらに時間測定オーバ​​ーヘッドを減らすために、あなたは、すべての10日に100回目...の繰り返しを測定することができます。

一回1024回の繰り返しで次の措置:

for (; (itera & 0x03FF) || (clock() < endClock); itera++) 
    { 
    } 

これは約500百万秒カウントあたりのループが表示されます。


タイマースレッドとチューニング

次はさらに複雑に支払った一部の10%の更なる改善が得られます。

std::atomic<bool> processing = true; 

// launch a timer thread to clear the processing flag after 1s 
std::thread t([&processing]() { 
    std::this_thread::sleep_for(std::chrono::seconds(1)); 
    processing = false;   
}); 

for (; (itera & 0x03FF) || processing; itera++) 
    { 
    } 

t.join(); 

余分なスレッドは1秒間スリープした開始され、制御変数を設定します。メインスレッドは、タイマースレッドが処理の終了を通知するまでループを実行します。

+0

測定値が正しい場合は、反復ごとに43.5ナノ秒です。最適化を有効にして実行しましたか? – bolov

+0

@bolov:リリースとデバッグモードを試しました。反復回数を表示したので、オプティマイザはループを食べてはいけません。しかし、あなたは正しいです、短期間は驚くべきことであり、さらなる分析に値するかもしれません。 –

+0

それは驚くべきことではありません。それは短くはない。リリースやデバッグで何時になったのですか? – bolov

関連する問題