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时间.
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是否完全支持.
| 归档时间: |
|
| 查看次数: |
33388 次 |
| 最近记录: |