C++での時間差をミリ秒で計算する方法を知っている人はいますか?私は difftime
を使用しましたが、測定しようとしているものに対して十分な精度がありません。
Timeval(マイクロ秒の分解能)またはtimespec(ナノ秒の分解能)のいずれかのより具体的な時間構造の1つを使用する必要がありますが、手動でかなり簡単に実行できます。
#include <time.h>
int diff_ms(timeval t1, timeval t2)
{
return (((t1.tv_sec - t2.tv_sec) * 1000000) +
(t1.tv_usec - t2.tv_usec))/1000;
}
時間の差が本当に大きい場合(または16ビットの整数の場合)は、明らかに整数オーバーフローにいくつかの問題がありますが、それはおそらく一般的なケースではありません。
これは古い質問であることはわかっていますが、C++ 0xの更新された回答があります。現代のユーティリティを含む<chrono>
という新しいヘッダーがあります。使用例:
#include <iostream>
#include <thread>
#include <chrono>
int main()
{
typedef std::chrono::high_resolution_clock Clock;
typedef std::chrono::milliseconds milliseconds;
Clock::time_point t0 = Clock::now();
std::this_thread::sleep_for(milliseconds(50));
Clock::time_point t1 = Clock::now();
milliseconds ms = std::chrono::duration_cast<milliseconds>(t1 - t0);
std::cout << ms.count() << "ms\n";
}
50ms
詳細はここにあります:
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2661.htm
また、<chrono>
のブースト実装もあります。
win32を使用している場合は、FILETIMEが最も正確です。1601年1月1日(UTC)以降の100ナノ秒間隔の数を表す64ビット値が含まれています。
したがって、2つの時間の差をミリ秒単位で計算する場合は、次のようにします。
UINT64 getTime()
{
SYSTEMTIME st;
GetSystemTime(&st);
FILETIME ft;
SystemTimeToFileTime(&st, &ft); // converts to file time format
ULARGE_INTEGER ui;
ui.LowPart=ft.dwLowDateTime;
ui.HighPart=ft.dwHighDateTime;
return ui.QuadPart;
}
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
//! Start counting time
UINT64 start, finish;
start=getTime();
//do something...
//! Stop counting elapsed time
finish = getTime();
//now you can calculate the difference any way that you want
//in seconds:
_tprintf(_T("Time elapsed executing this code: %.03f seconds."), (((float)(finish-start))/((float)10000))/1000 );
//or in miliseconds
_tprintf(_T("Time elapsed executing this code: %I64d seconds."), (finish-start)/10000 );
}
時計機能はミリ秒のタイマーを提供しますが、それは最高ではありません。実際の解像度はシステムに依存します。あなたが試すことができます
#include <time.h>
int clo = clock();
//do stuff
cout << (clock() - clo) << endl;
あなたの結果がどうであるかを見てください。
gettimeofday
を使用して、エポック以降のマイクロ秒数を取得できます。 gettimeofday()によって返される値の秒セグメントは、time()によって返されるものと同じであり、time_tにキャストしてdifftimeで使用できます。ミリ秒は1000マイクロ秒です。
Difftimeを使用した後、マイクロ秒フィールドの差を自分で計算します。
Boost.Date_Time からマイクロ秒とナノ秒の精度を得ることができます。
プラットフォーム固有のものを使用する必要があると思います。うまくいけば、それは重要ではありませんか?例えば。 Windowsでは、ミリ秒よりもはるかに優れたQueryPerformanceCounter()
を確認してください。