c++ - 带有无符号tickCount/Wrapping的耗时

标签 c++

我有一个自己的 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/

相关文章:

c++ - 为什么不打印完整的小数?

c++ - 初始化时返回一个指针? C++

c++ - Google 测试框架中的可复制模拟

c++ - 为什么所有cout和cin的“未声明标识符

c++ - 尽管有非默认构造函数参数,但在 const 引用成员上调用默认构造函数

c++ - 自定义 STL 容器包装器报告奇怪的编译器错误

c++ - 任何 vector 的特化

c++ - C++11 中常量表达式的模板 int 参数

c++ - 继承错误 - 无法实例化抽象类\无法访问类中声明的 protected 成员

c++ - 使用用户生成的文件名创建 ifstream?