アプリケーションを起動してから別の時刻(たとえば16:00時)までの時間をミリ秒単位で測定したいと思います。これを行うための最良の方法は何ですか?
「時計」機能を見回しましたが、必要なものではありません。
オペレーティングシステム:WinNT以降
POSIXシステムの場合はgettimeofdayを、Windowsの場合はtimeGetTimeを検索します。
編集:OPが現在の時刻/日付を別の時刻/日付と比較するコードを要求していたようです。次のスニペットは、Windowsで現在の日付と時刻を取得する方法を示しています。
#include <Windows.h> #include <stdio.h> void main() { SYSTEMTIME st; GetSystemTime(&st); printf("Year:%d\nMonth:%d\nDate:%d\nHour:%d\nMin:%d\nSecond:%d\n" ,st.wYear,st.wMonth,st.wDay,st.wHour,st.wMinute,st.wSecond); }
そして、2つのSYSTEMTIMEオブジェクト間の差を計算する方法は次のとおりです。
#include <windows.h> #include <iostream> // Return time difference in units of 100 us. _int64 Delta(const SYSTEMTIME st1, const SYSTEMTIME st2) { union timeunion { FILETIME fileTime; ULARGE_INTEGER ul; } ; timeunion ft1; timeunion ft2; SystemTimeToFileTime(&st1, &ft1.fileTime); SystemTimeToFileTime(&st2, &ft2.fileTime); return ft2.ul.QuadPart - ft1.ul.QuadPart; } int main() { SYSTEMTIME t1 = {0}, t2 = {0}; t1.wDay = 10; t1.wMonth = 4; t1.wYear = 2009; t2.wDay = 12; t2.wMonth = 4; t2.wYear = 2009; _int64 i = Delta(t1, t2); std::cout << "times are " << i / 10000000 << " seconds apart\n"; return 0; }
これらの2つのサンプルは、必要なことを実行するためのツールを提供するはずです。
POSIXシステムを使用している場合は、次を使用できますgettimeofday(3)
。
struct timeval start, end;
gettimeofday(&start, NULL);
...
gettimeofday(&end, NULL);
// Watch out for overflow!
int delta_milliseconds = 1000 * (end.tv_sec - start.tv_sec) + (end.tv_usec - start.tv_usec)/1000;
Windowsを使用している場合は、次を使用できますGetTickCount
。
DWORD start, end;
start = GetTickCount();
...
end = GetTickCount();
int delta_milliseconds = end - start;
ただしGetTickCount
、解像度は約10〜16ミリ秒しかないことに注意してください。より高い精度が必要な場合は、代わりに次を使用QueryPerformanceCounter
しQueryPerformanceFrequency
てください。
// Error-checking omitted for expository purposes
LARGE_INTEGER freq, start, end;
QueryPerformanceFrequency(&freq);
QueryPerformanceCounter(&start);
...
QueryPerformanceCounter(&end);
double delta_milliseconds = (double)(end.QuadPart - start.QuadPart) / freq.QuadPart * 1000.0;