34

C++ の時間差をミリ秒単位で計算する方法を知っている人はいますか? 使用difftimeしましたが、測定しようとしているものに対して十分な精度がありません。

4

8 に答える 8

78

これは古い質問ですが、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>ます。

于 2011-02-11T22:09:22.350 に答える
21

timeval (マイクロ秒の解像度) または timespec (ナノ秒の解像度) のいずれか、より具体的な時間構造のいずれかを使用する必要がありますが、手動でかなり簡単に行うことができます。

#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 ビットの int がある場合) には、明らかに整数オーバーフローの問題がありますが、これはおそらく一般的なケースではありません。

于 2008-11-21T02:04:46.370 に答える
7

win32 を使用している場合、取得できる最も正確なファイルタイムは次のとおりです。

したがって、ミリ秒単位で 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 );
}
于 2009-01-22T23:53:11.487 に答える
5

時計機能はミリ秒タイマーを提供しますが、それは最高ではありません。その実際の解像度は、システムによって異なります。あなたが試すことができます

#include <time.h>

int clo = clock();
//do stuff
cout << (clock() - clo) << endl;

そして、あなたの結果がどのようであるかを見てください。

于 2008-11-21T02:05:28.740 に答える
2

gettimeofdayエポックからのマイクロ秒数を取得するために使用できます。gettimeofday() によって返される値の秒セグメントは、time() によって返される値と同じであり、time_t にキャストして difftime で使用できます。1 ミリ秒は 1000 マイクロ秒です。

difftime を使用した後、マイクロ秒フィールドの差を自分で計算します。

于 2008-11-21T02:03:19.417 に答える
2

Boost.Date_Timeからマイクロ秒およびナノ秒の精度を取得できます。

于 2008-11-21T02:52:23.467 に答える
1

ベンチマークを検討している場合は、このトピックについて議論している SO に関する他の スレッドを参照してください。

また、精度と精度の違いを理解していることを確認してください。

于 2008-11-21T02:27:10.803 に答える
0

プラットフォーム固有のものを使用する必要があると思います。うまくいけば、それは問題ではありませんか?例えば。Windows では、QueryPerformanceCounter()ミリ秒よりもはるかに優れた値が得られるものを見てください。

于 2008-11-21T02:44:17.243 に答える