:
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秒間スリープした開始され、制御変数を設定します。メインスレッドは、タイマースレッドが処理の終了を通知するまでループを実行します。
時間がミリ秒に、さらにはナノ秒の分解能までプロファイルするのに使用されているので、オーバーヘッドは無視できると思います。 – bolov
うん、オーバーヘッドはごくわずかです。ここで時間を取得する方法は多かれ少なかれトレースされています:http://stackoverflow.com/a/38916054/357403 – Koshinae