gpt4 book ai didi

c++ - 无符号 tickCount/Wrapping 的运行时间

转载 作者:搜寻专家 更新时间:2023-10-31 01:21:50 25 4
gpt4 key购买 nike

我有一个自己的 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() 可能仅精确到大约 18 毫秒,而 QueryPerformanceCounter() 将优于 1us。

关于c++ - 无符号 tickCount/Wrapping 的运行时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3491001/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com