10

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

我看过

钟()

当地时间

时间

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

谁能指出我正确的方向如何做到这一点,或者即使它可能?

我想做的概述:

我希望能够计算应用程序“执行”某个功能的时间。

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

我正在尝试将它从 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;
}
4

5 回答 5

21

在 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 时间。

于 2010-04-30T20:23:43.887 回答
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()返回是否经过墙上时间或处理器时间似乎存在不确定性。我检查的前几个参考资料说的是墙上时间。例如:

返回程序启动后经过的时钟滴答数。

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

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

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

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

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

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

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

于 2010-04-29T16:20:38.650 回答
3

这取决于平台,因此您只需编写一个包装器并实现每个平台的细节。

于 2010-04-29T15:50:28.567 回答
1

这是不可能的。C++ 标准,因此标准库,对处理器或“滴答”一无所知。这可能会或可能不会在 C++0x 中通过线程支持发生变化,但至少目前是不可能的。

于 2010-04-29T15:44:11.747 回答
1

您可以访问 Android 上的 vblank 中断功能(或 hblank)吗?如果是这样,请在此处为计时器增加一个全局的、可变的 var。

于 2010-04-29T15:45:16.820 回答