2010-02-16 174 views
1

如何将微秒转换为毫秒并通过减法比较时间戳? 例子:转换和微秒和毫秒比较

int t1 = (int)timeGetTime();  
int t2 = (int)timeGetTime()+40; 
// now t1 - t2 < 0 which means that t1 < t2. 

,如果你除以1000的时间值,以微秒转换成毫秒,这个逻辑将无法正常工作。

编辑

我想唯一的解决办法是将所有的时间戳存储在微秒。转换为毫秒只能在减去之后进行,以达到增量值。

+0

你是什么意思,它“不会工作”? 400000微秒==(400000/1000)== 400毫秒。 400微秒== 0毫秒。也许你被整数师绊倒了? – 2010-02-16 17:13:45

+0

你在哪里有微秒的分辨率? timeGetTime()返回以毫秒为单位的时间。 – Tim 2010-02-16 17:17:10

+0

转换为更高分辨率是没有意义的 - 它们都将以“000”结尾。你为什么这么做? – Tim 2010-02-16 17:17:56

回答

1

为什么不将millisec值乘以1000以便以微秒进行比较?或者,也可以使用浮点数。

+1

时域数据的浮点类型通常是计数器指示的:时钟既可以返回特定的时钟,也可以不返回特定的时钟,因此数据本质上是整数。只需使用足够大的整数类型。 – dmckee 2010-02-16 17:29:34

+0

浮点数最终会溢出。整数无关紧要,因为通常它们仅用于与其他整数时间值进行比较。 – AareP 2010-02-16 19:58:39

1

Windows中的时钟计时器的分辨率限制在10毫秒左右,因此您将永远无法获得时间值达到微秒级的精度。

如果您的时间值来自其他能够提供该分辨率的地方,那么将这些值作为微秒。乘以1000或将int除以1000不会给你更好的分辨率,它只会改变比较的比例。

+0

关于臭名昭着的Raymond Chen的精确度和准确性的有趣聊天: http://blogs.msdn.com/oldnewthing/archive/2005/09/02/459952.aspx – Phill 2010-02-16 17:37:18

+0

我知道,我的微秒值来自QueryPerformanceCounter。我想要的是以不同的单位进行计算,而不是微秒。厌倦了写下所有这些零,如:time/1000000 ... – AareP 2010-02-16 19:57:05

+0

好的,首先,即使你得到的值是微秒,但并不意味着该值对于Raymond Chen的文章来说是准确的。其次,我真的不明白你在问什么,只是你想能够转换为秒,而不喜欢输入零值?使用一个常量。第三,如果你真的想这样做,那么只需使用double:double milliseconds =((double)microSeconds)/ 1000d(或C++等效或this)。尽管如此,我仍然认为你可能会误解这个潜在的问题。 – Phill 2010-02-17 16:27:07

0

您需要使用高分辨率定时器才能获得微秒粒度时间。

您可以使用Windows API检查您可以制作的粒度。

QueryPerformanceFrequency(& ticksPerSecond); QueryPerformanceCounter(& tick);

这两个函数将帮助你这样。看看MSDN articles了解更多。 :)