我本质上想要重建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;
}
答案 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()
是否会返回经过时间或处理器时间似乎存在不确定性。我检查的前几个参考文献说壁挂时间。例如:
不可否认,这有点模糊。 MSDN更明确:Returns the number of clock ticks elapsed since the program was launched.
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变量。