使用unsigned tickCount / Wrapping的已用时间

时间:2010-08-16 06:19:52

标签: c++

我有一个自己的GetTickCount()函数返回一个unsigned int(计数在0xFFFFFFFF上翻到零)

我无法通过以下方式衡量经过的时间:

unsigned int elapsed;
unsigned int start = GetTickCount();
LongOperation();
unsigned int stop = GetTickCount();

if (stop >= start )
   elapsed = stop - start;
else
   elapsed = (INT_MAX - start) + stop;

如果我进行了签名转换,这是相同的(我测量的时间跨度总是小于可以用有符号整数表示的时间 - 我想24天左右)? :

int start = (int)GetTickCount();
LongOperation();
int elapsedTime = (int)GetTickCount() - start;

如果我查看.net Environmet.TickCount属性:

  

TickCount将从零增加到Int32 .. ::。MaxValue大约24.9天,然后跳转到Int32 .. ::。MinValue,这是一个负数,然后在下一个24.9期间增加回零天。

所以当我将GetTickCount()函数转换为有符号整数时,我应该从.net获取行为(包装发生在0x7FFFFFFF-> 0x80000000)?

这应该可以测量经过的时间如下(见另一篇文章):

int start = Environment.TickCount; 
DoLongRunningOperation(); 
int elapsedTime = Environment.TickCount - start; 

3 个答案:

答案 0 :(得分:3)

Windows中C ++中的GetTickCount()原型是: DWORD WINAPI GetTickCount(void);

所以我会像这样编码(类似于其他答案):

DWORD start = GetTickCount();
dosomething();
DWORD elapsed = GetTickCount() - start;

将测量经过的时间直到DWORD可以表示的最大数量。

正如其他人所说,使用无符号算术,你不必担心计数器缠绕 - 自己试试......

同时检查GetTickCount64和QueryPerformanceCounter / QueryPerformanceFrequency。 GetTickCount64允许您测量更长的间隔,但不支持所有版本的Windows,而QueryPerformanceCounter允许您测量更高的分辨率和准确度。例如,在某些Windows版本中,GetTickCount()可能只能精确到大约18ms,而QueryPerformanceCounter将优于1us。

答案 1 :(得分:1)

我不确定GetTickCount()是您问题的首选功能。

你不能只使用QueryPerformanceFrequency()吗?有一个很好的例子 http://msdn.microsoft.com/en-us/library/ms644904%28v=VS.85%29.aspx

答案 2 :(得分:0)

在C ++中,如果坚持使用unsigned,代码将起作用:

unsigned int start = gettickcount();
DoLongRunningOperation();
unsigned int elapsedTime = static_cast<unsigned int>(gettickcount()) - start;

你想坚持使用无符号的原因是需要无符号算术来使用模数运算,这就是你想要的。