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 位整数),这显然会出现整数溢出问题,但这可能不是常见的情况。

于 2008-11-21T02:04:46.370 回答
7

如果您使用的是 win32 FILETIME 是您可以获得的最准确的:包含一个 64 位值,表示自 1601 年 1 月 1 日 (UTC) 以来 100 纳秒间隔的数量。

因此,如果您想以毫秒为单位计算两次之间的差异,请执行以下操作:

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 中使用。一毫秒是 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 回答