使用基本C++获取系统滴答计数?

Don*_*rty 9 c++ time porting android-ndk

我本质上想要重建getTickCount()窗口函数,这样我就可以在基本的C++中使用它而不需要任何非标准库甚至STL.(因此它符合随Android NDK提供的库)

我看过了

时钟()

当地时间

时间

但我仍然不确定是否可以使用时间库复制getTickCount窗口函数.

任何人都可以指出我正确的方向,如何做到这一点,甚至可能吗?

我想要做的概述:

我希望能够计算应用程序"执行"某个功能的时间.

因此,例如,我希望能够计算应用程序尝试向服务器注册的时间

我试图从Windows移植它在基于Linux的Android上运行,这里是windows代码:


int TimeoutTimer::GetSpentTime() const
{
if (m_On)
{
    if (m_Freq>1)
    {
        unsigned int now;
        QueryPerformanceCounter((int*)&now);
        return (int)((1000*(now-m_Start))/m_Freq);
    }
    else
    {
        return (GetTickCount()-(int)m_Start);
    }
}
return -1;
}
Run Code Online (Sandbox Code Playgroud)

fad*_*den 19

在Android NDK上,您可以使用POSIX clock_gettime()调用,它是libc的一部分.此功能是各种Android计时器调用结束的地方.

例如,java.lang.System.nanoTime()实现为:

struct timespec now;
clock_gettime(CLOCK_MONOTONIC, &now);
return (u8)now.tv_sec*1000000000LL + now.tv_nsec;
Run Code Online (Sandbox Code Playgroud)

此示例使用单调时钟,这是计算持续时间时所需的时钟.与挂钟(可通过gettimeofday()获得)不同,当网络提供商更改设备的时钟时,它不会向前或向后跳过.

clock_gettime()的Linux手册页描述了可用的其他时钟,例如每线程经过的CPU时间.


Adr*_*thy 9

clock()与Windows的工作方式非常相似GetTickCount().单位可能不同. GetTickCount()返回毫秒. 每秒clock()返回CLOCKS_PER_SEC滴答.两者都有翻转的最大值(对于Windows,大约是49.7天).

GetTickCount()操作系统启动时从零开始.从文档中看,它看起来就像clock()进程一样.因此,您可以比较进程之间的时间GetTickCount(),但您可能无法与之进行比较clock().

如果你想在一个过程中计算出事情发生了多长时间,而你并不担心翻转:

const clock_t start = clock();
// do stuff here
clock_t now = clock();
clock_t delta = now - start;
double seconds_elapsed = static_cast<double>(delta) / CLOCKS_PER_SEC;
Run Code Online (Sandbox Code Playgroud)

澄清:clock()回报是否经过了时间或处理器时间似乎存在不确定性.我检查的前几个参考文献说壁挂时间.例如:

返回自程序启动以来经过的时钟周期数.

诚然,这有点模糊.MSDN更明确:

自进程开始以来经过的挂钟时间 ....

用户darron说服我深入挖掘,所以我找到了C标准的草稿(ISO/IEC 9899:TC2),它说:

...返回实现对所用处理器时间的最佳近似值...

我相信我曾经使用的每个实现都给出了挂钟时间(我想这是所用处理器时间的近似值).

结论: 如果您正在尝试对代码进行计时以便可以对各种优化进行基准测试,那么我的答案是合适的.如果您尝试根据实际挂钟时间实现超时,则必须检查本地实现clock()或使用记录的其他函数来提供挂钟时间.

更新: 使用C++ 11,还有标准库的一部分,它提供各种时钟和类型来捕获时间和持续时间.虽然标准化和广泛可用,但尚不清楚Android NDK是否完全支持.