我有一个自己的 GetTickCount() 函数,返回一个无符号整数(计数在 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 will increment from zero to Int32..::.MaxValue for approximately 24.9 days, then jump to Int32..::.MinValue, which is a negative number, then increment back to zero during the next 24.9 days.
所以当我将 GetTickCount() 函数转换为有符号整数时,我应该从 .net 获取行为(包装发生在 0x7FFFFFFF->0x80000000 上)?
这样应该可以测量耗时,如下所示(见另一篇文章):
int start = Environment.TickCount;
DoLongRunningOperation();
int elapsedTime = Environment.TickCount - start;
最佳答案
Windows 中 C++ 中 GetTickCount()
的原型(prototype)是:
DWORD WINAPI GetTickCount(void);
所以,我会这样编码(类似于其他答案):
DWORD start = GetTickCount();
dosomething();
DWORD elapsed = GetTickCount() - start;
将测量耗时,直到 DWORD
可以表示的最大数量。
正如其他人所说,使用无符号算术,您无需担心计数器回绕 - 自己尝试一下...
另请检查 GetTickCount64()
和 QueryPerformanceCounter()
/QueryPerformanceFrequency()
。 GetTickCount64()
将允许您测量更长的间隔,但并非所有版本的 Windows 都支持它,而 QueryPerformanceCounter()
允许您测量更高的分辨率和准确性。例如,在某些 Windows 版本上,GetTickCount()
可能只能精确到 18ms 左右,而 QueryPerformanceCounter()
将优于 1us。
关于c++ - 带有无符号tickCount/Wrapping的耗时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3491001/