在C ++中计算毫秒的便携方式?

时间:2010-06-09 10:13:23

标签: c++ windows linux time portability

是否有任何便携式(Windows& Linux)方式可以计算两次通话之间经过的毫秒数?

基本上,我希望实现与StopWatch .NET类相同的功能。 (对于那些已经使用过它的人)

在一个完美的世界里,我会使用boost::date_time,但这不是一个选项,因为我强制要遵守一些愚蠢的规则。

对于那些更好地阅读代码的人来说,这就是我想要实现的目标。

Timer timer;

timer.start();
// Some instructions here
timer.stop();

// Print out the elapsed time
std::cout << "Elapsed time: " << timer.milliseconds() << "ms" << std::endl;

那么,如果有一个可以帮助我实现Timer类的可移植(一组)函数,它是什么?如果没有这样的功能,Windows&amp;我应该使用Linux API来实现这个功能吗? (使用#ifdef WINDOWS - 像宏一样)

谢谢!

4 个答案:

答案 0 :(得分:4)

在Linux上(通常在POSIX中),您可以使用gettimeofday函数,该函数返回自Epoch以来的微秒数。在Windows上,有GetTickCount函数,它返回自系统启动以来的毫秒数。

答案 1 :(得分:2)

clock()(在Time.h中)返回一个每秒增加CLOCKS_PER_SEC的值,通常为1000。

答案 2 :(得分:0)

在Windows上,使用高性能计时器,这是一个轻而易举的事。

LARGE_INTEGER frequency;
LARGE_INTEGER one;
LARGE_INTEGER two;
QueryPerformanceFrequency(&frequency);
QueryPerformanceCounter(&one);
// something
QueryPerformanceCounter(&two);
std::cout << (((double)two.QuadPart - (double)one.QuadPart) / (double)frequency.QuadPart) * (double)1000;

理论上,这可以达到每时钟周期的精度,具体取决于所讨论的CPU。

答案 3 :(得分:0)

这是我执行此任务的代码(Boost许可证) 其中ptime是表示以秒为单位的时间+纳秒ptime(int sec,int nano)

ptime :: microseconds从posix time microseconds创建sec / nano对。

根据您的需要重写它并编写这样的课程非常容易。

ptime ptime::now()
{
    #ifndef BOOSTER_WIN_NATIVE
    struct timeval tv;
    gettimeofday(&tv,0);
    return ptime(tv.tv_sec,tv.tv_usec * 1000);
    #else
    FILETIME ft;
    GetSystemTimeAsFileTime(&ft);
    unsigned long long tt = ft.dwHighDateTime;
    tt <<=32;
    tt |= ft.dwLowDateTime;
    tt /=10;
    tt -= 11644473600000000ULL;
    return ptime(ptime::microseconds(tt));
    #endif
}

此处没有可移植的C ++函数......