当前位置: 技术问答>linux和unix
[求助]一个关于计时的问题
来源: 互联网 发布时间:2015-08-20
本文导语: 在程序运行中要获取该程序的已运行时间,要求精确到毫秒、跟系统时间无关、能够跨平台。 现在我的做法是: void KTimer::Start() { #ifdef WIN32 QueryPerformanceCounter(&m_nTimeStart); #else gettimeofday(&m_nTimeStart, NULL); #endif } DW...
在程序运行中要获取该程序的已运行时间,要求精确到毫秒、跟系统时间无关、能够跨平台。
现在我的做法是:
void KTimer::Start()
{
#ifdef WIN32
QueryPerformanceCounter(&m_nTimeStart);
#else
gettimeofday(&m_nTimeStart, NULL);
#endif
}
DWORD KTimer::GetElapse()
{
#ifdef WIN32
LARGE_INTEGER nTime;
QueryPerformanceCounter(&nTime);
return (DWORD)((nTime.QuadPart - m_nTimeStart.QuadPart)
* 1000 / m_nFrequency.QuadPart);
#else
timeval tv;
gettimeofday(&tv, NULL);
return (tv.tv_sec - m_nTimeStart.tv_sec) * 1000 + tv.tv_usec / 1000;
#endif
}
但是发现gettimeofday是跟系统时间相关的,这样当在程序运行时修改系统时间就会出现计时错误。
在网上搜了一下,还可以通过CPU的RDTSC时钟计数器来做比较,但是似乎对CPU有限制,而且据说也没有保证会不会计数出错,不知道大家有没有其他更好的方法?谢谢啦!
现在我的做法是:
void KTimer::Start()
{
#ifdef WIN32
QueryPerformanceCounter(&m_nTimeStart);
#else
gettimeofday(&m_nTimeStart, NULL);
#endif
}
DWORD KTimer::GetElapse()
{
#ifdef WIN32
LARGE_INTEGER nTime;
QueryPerformanceCounter(&nTime);
return (DWORD)((nTime.QuadPart - m_nTimeStart.QuadPart)
* 1000 / m_nFrequency.QuadPart);
#else
timeval tv;
gettimeofday(&tv, NULL);
return (tv.tv_sec - m_nTimeStart.tv_sec) * 1000 + tv.tv_usec / 1000;
#endif
}
但是发现gettimeofday是跟系统时间相关的,这样当在程序运行时修改系统时间就会出现计时错误。
在网上搜了一下,还可以通过CPU的RDTSC时钟计数器来做比较,但是似乎对CPU有限制,而且据说也没有保证会不会计数出错,不知道大家有没有其他更好的方法?谢谢啦!
|
clock_t times(struct tms *buf);
sysconf(_SC_CLK_TCK);
sysconf(_SC_CLK_TCK);