【问题标题】:elapsed time with unsigned tickCount / Wrapping无符号滴答计数/换行的经过时间
【发布时间】:2010-08-16 06:19:52
【问题描述】:

我有一个自己的 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 将从零递增到 Int32..::.MaxValue 大约 24.9 天,然后跳转到 Int32..::.MinValue,这是一个负数,然后在接下来的 24.9 期间递增回零天。

所以当我将 GetTickCount() 函数转换为有符号整数时,我应该从 .net 获得行为(包装发生在 0x7FFFFFFF->0x80000000)?

这样应该可以测量经过的时间如下(见另一篇文章):

int start = Environment.TickCount; 
DoLongRunningOperation(); 
int elapsedTime = Environment.TickCount - start; 

【问题讨论】:

  • 没有。经过的时间可能适合整数,但将“开始”和“结束”类型转换为有符号整数可能会给出错误的值。

标签: c++


【解决方案1】:

Windows 中 C++ 中GetTickCount() 的原型是:

DWORD WINAPI GetTickCount(void);

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

DWORD start = GetTickCount();
dosomething();
DWORD elapsed = GetTickCount() - start;

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

正如其他人所说,使用无符号算术,您无需担心计数器环绕 - 自己尝试一下...

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

【讨论】:

    【解决方案2】:

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

    你不能只使用 QueryPerformanceFrequency() 吗?有一个很好的例子 http://msdn.microsoft.com/en-us/library/ms644904%28v=VS.85%29.aspx

    【讨论】:

      【解决方案3】:

      在 C++ 中,如果你坚持使用无符号,代码将起作用:

      unsigned int start = gettickcount();
      DoLongRunningOperation();
      unsigned int elapsedTime = static_cast<unsigned int>(gettickcount()) - start;
      

      您要坚持使用无符号的原因是无符号算术需要使用模算术,这就是您在这种情况下想要的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多