C++ 无符号计时/换行的已用时间

C++ 无符号计时/换行的已用时间,c++,C++,我有一个自己的GetTickCount()函数,返回一个无符号的int(0xFFFFFF上的计数转为零) 我无法通过以下方式测量经过的时间: unsigned int elapsed; unsigned int start = GetTickCount(); LongOperation(); unsigned int stop = GetTickCount(); if (stop >= start ) elapsed = stop - start; else elapsed

我有一个自己的GetTickCount()函数,返回一个无符号的int(0xFFFFFF上的计数转为零)

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

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天),这是否相同

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

TickCount将从零增加到Int32..::.MaxValue大约24.9天,然后跳到Int32..::.MinValue,这是一个负数,然后在接下来的24.9天内增加回零

因此,当我将GetTickCount()函数强制转换为有符号整数时,我应该从.net获取行为(包装发生在0x7FFFFFFF->0x8000000上)

这样就可以按照以下方式测量经过的时间(见另一篇文章):


C++中,如果你使用无符号,代码将工作:

unsigned int start = gettickcount();
DoLongRunningOperation();
unsigned int elapsedTime = static_cast<unsigned int>(gettickcount()) - start;
unsigned int start=gettickcount();
多龙运行操作();
unsigned int elapsedTime=static_cast(gettickcount())-start;
您坚持使用unsigned的原因是,无符号算术需要使用模运算,这正是您在本例中所需要的。

我不确定GetTickCount()是否是解决问题的首选函数

您不能只使用QueryPerformanceFrequency()吗?这里有一个很好的例子

< P> Windows中C++中GETICKCONTUTH()的原型是: DWORD WINAPI GetTickCount(无效)

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

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

正如其他人所说,使用无符号算术,您不需要担心计数器的缠绕-您自己试试吧


同时检查GetTickCount64和QueryPerformanceCounter/QueryPerformanceFrequency。GetTickCount64允许您测量更长的间隔,但并非所有版本的Windows都支持它,而QueryPerformanceCounter允许您测量到更高的分辨率和精度。例如,在某些windows版本上,GetTickCount()的精度可能仅为18ms左右,而QueryPerformanceCounter的精度将优于1us。

否。经过的时间可能适合整数,但“开始”和“结束”的带符号整数的类型转换可能会给出错误的值。
int start = Environment.TickCount; 
DoLongRunningOperation(); 
int elapsedTime = Environment.TickCount - start; 
unsigned int start = gettickcount();
DoLongRunningOperation();
unsigned int elapsedTime = static_cast<unsigned int>(gettickcount()) - start;
DWORD start = GetTickCount();
dosomething();
DWORD elapsed = GetTickCount() - start;