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

时间:2010-04-29 15:41:05

标签: c++ time android-ndk porting

我本质上想要重建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;
}

5 个答案:

答案 0 :(得分: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;

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

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

答案 1 :(得分: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;

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

  

Returns the number of clock ticks elapsed since the program was launched.

不可否认,这有点模糊。 MSDN更明确:

  

The elapsed wall-clock time since the start of the process....

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

  

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

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

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

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

答案 2 :(得分:3)

这是依赖于平台的,所以你只需编写一个包装器并实现每个平台的细节。

答案 3 :(得分:1)

这是不可能的。 C ++标准以及标准库对处理器或“滴答”一无所知。这可能会或者可能不会在C ++ 0x中通过线程支持进行更改,但至少现在,这是不可能的。

答案 4 :(得分:1)

您是否可以访问Android上的vblank中断函数(或hblank)?如果是这样,则为定时器增加一个全局的volatile变量。