C+中的时差+; 有人知道如何在毫秒内计算C++中的时差吗? 我用过,但它没有足够的精度来测量。

C+中的时差+; 有人知道如何在毫秒内计算C++中的时差吗? 我用过,但它没有足够的精度来测量。,c++,time,C++,Time,你可以用它来获得自epoch以来的微秒数。gettimeofday()返回的值的秒段与time()返回的秒段相同,可以转换为time,并在difftime中使用。一毫秒是1000微秒 使用difftime后,请自己计算微秒字段中的差值。您必须使用更具体的时间结构之一,即timeval(微秒分辨率)或timespec(纳秒分辨率),但您可以相当轻松地手动执行此操作: #include <time.h> int diff_ms(timeval t1, timeval t2) {

你可以用它来获得自epoch以来的微秒数。gettimeofday()返回的值的秒段与time()返回的秒段相同,可以转换为time,并在difftime中使用。一毫秒是1000微秒


使用difftime后,请自己计算微秒字段中的差值。

您必须使用更具体的时间结构之一,即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;
}
#包括
内部差异(时间值t1,时间值t2)
{
返回((t1.tv秒-t2.tv秒)*1000000)+
(t1.tv_usec-t2.tv_usec))/1000;
}

如果时间差真的很大(或者如果有16位整数),这显然会出现整数溢出问题,但这可能不是常见的情况。

时钟函数提供毫秒计时器,但它不是最大的计时器。它的真正分辨率将取决于您的系统。你可以试试

#include <time.h>

int clo = clock();
//do stuff
cout << (clock() - clo) << endl;
#包括
int clo=时钟();
//做事

cout如果你想做基准测试,你可能想看看这里讨论这个话题的一些例子


另外,请确保您了解准确度和精确度之间的区别。

我认为您必须使用特定于平台的工具。希望那没关系吧? 例如,在Windows上,查看
QueryPerformanceCounter()
,它将为您提供更多信息
优于毫秒。

您可以获得微秒和纳秒精度。

如果您使用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 );
}

我知道这是一个老问题,但是C++0x有一个更新的答案。有一个名为
的新标题,其中包含现代实用程序。示例用法:

#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
#包括
#包括
#包括
int main()
{
typedef std::chrono::高分辨率时钟;
typedef std::chrono::毫秒;
时钟::时间点t0=时钟::现在();
std::this_thread::sleep_for(毫秒(50));
时钟::时间点t1=时钟::现在();
毫秒ms=std::chrono::duration_cast(t1-t0);

std::我想你可能需要*1000而不是*1000000。在除以1000之前,你可能需要加上+500 usec,这样999usec可以被四舍五入到1秒而不是0秒。不,我的意思是*1000000。它在美国进行计算,然后在最后转换为ms。不过+500建议是个好建议。派对才晚了5年,但我同意th@SoapBox,如果您将乘法从内部参数外取1000,也就是说,使加法在MS上运行,那么您可以将溢出问题最小化。或者,我们可以使用标准timersub,然后将结果tv转换为MS。这在Unix和Linux系统上非常典型。不过,我认为它可能会糟糕到大约50 MS中的CLOCKS_PER_SEC宏告诉您每秒有多少个时钟。它通常是50或60,给出20或16.7毫秒。实际上,CLOCKS_PER_SEC给出了每秒的时钟单位数。例如,您可能有1000个时钟(clock()返回毫秒),但clock()返回16毫秒的倍数。Call clock()在一个紧密的循环中,它将返回:x,…,x,x+16,…,x+16,x+32…在我的系统+1上,对于纯win32环境。简单而有效。我再次学到了一些东西。这对于纳秒来说是准确的吗?我的意思是,你在@Wildling上写了一个非常不同的方法:另一种方法是在另一个上下文中,其他答案使用rdtsc汇编指令。该答案简单地说明了如何将rdtsc汇编指令集成到时钟中。该答案说明了如何使用时钟设备获得以毫秒为单位的时差。精度将取决于提供的高分辨率时钟。该时钟的分辨率可通过
高分辨率进行检查解决方案时钟::周期
。在我的系统上,这恰好是纳秒。在你的系统上,这可能是不同的。我只是尝试了你的两种方法(这个答案和另一个)分析一些代码。
类时钟
的结果是上述代码显示结果的一半。你知道为什么吗?如果没有看到确切的代码,很难知道。但是猜测可能包括:你忽略了将时钟节拍转换为已知单位,如纳秒。或者可能是你为时钟输入的周期不是处理器速度的准确表示。或者可能计时代码太短,以至于您正在推低可以精确计时的下限(所有时钟都有开销)。很好,您正在使用这些不同的时钟进行实验。这是了解它们的一个好方法。我刚刚进行了更多的运行,并意识到结果实际上相差不远!但是有时代码会在很短的时间内执行。您能看一下结果吗: