5

次のコードがあります。

long long unsigned int GetCurrentTimestamp()
{
   LARGE_INTEGER res;
   QueryPerformanceCounter(&res);
   return res.QuadPart;
}


long long unsigned int initalizeFrequency()
{
   LARGE_INTEGER res;
   QueryPerformanceFrequency(&res);
   return res.QuadPart;
}


//start time stamp
boost::posix_time::ptime startTime = boost::posix_time::microsec_clock::local_time();
long long unsigned int start = GetCurrentTimestamp();


// ....
// execution that should be measured
// ....

long long unsigned int end = GetCurrentTimestamp();
boost::posix_time::ptime endTime = boost::posix_time::microsec_clock::local_time();
boost::posix_time::time_duration duration = endTime - startTime;
std::cout << "Duration by Boost posix: " << duration.total_microseconds() <<std::endl;
std::cout << "Processing time is " << ((end - start) * 1000000 / initalizeFrequency()) 
            << " microsec "<< std::endl;

このコードの結果は

Duration by Boost posix: 0
Processing time is 24 microsec

なぜこのような大きな相違があるのでしょうか。ブーストは、マイクロ秒を測定する必要があるのと同じくらいひどいですが、マイクロ秒の10分の1の誤差でマイクロ秒を測定します???

4

2 に答える 2

4

Posix 時間: microsec_clock:

1 秒未満の解像度のクロックを使用して UTC 時刻を取得します。Unix システムでは、これは GetTimeOfDay を使用して実装されます。ほとんどの Win32 プラットフォームでは、ftime を使用して実装されています。Win32 システムでは、この API を介してマイクロ秒の解像度を達成できないことがよくあります。アプリケーションにとってより高い解像度が重要な場合は、プラットフォームをテストして、達成された解像度を確認してください。

ftimeマイクロ秒の分解能を提供しません。引数には単語microsecondが含まれる場合がありますが、実装ではその範囲の精度は提供されません。その粒度はミリ秒体制にあります。

操作にもっと時間が必要な場合、たとえば少なくとも 20 ミリ秒以上かかる場合は、ZERO とは異なる結果が得られます。

編集:注: 長期的にはmicrosec_clock、Windows の実装では、マイクロ秒の解像度を達成するために、可能な場合はGetSystemTimePreciseAsFileTime 関数を使用する必要があります(Windows 8 デスクトップ、Windows Server 2012 デスクトップの最小要件)。

于 2012-10-19T10:46:02.827 に答える
2

残念ながら、現在の Boost 実装はWin32 API をboost::posix_time::microsec_clock使用せず、代わりに を使用します。しかし、システムの時間分解能はミリ秒 (またはそれ以上) です。QueryPerformanceCounterGetSystemTimeAsFileTimeGetSystemTime

于 2012-10-19T10:59:37.227 に答える