我有一个自己的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;
答案 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;
你想坚持使用无符号的原因是需要无符号算术来使用模数运算,这就是你想要的。