测试某个事件是否经过N毫秒的最快方法

时间:2012-03-13 18:54:09

标签: c#

我正在编写udp多播数据报接收器。

如果我收到数字X的数据报并且数据报“X-1”仍未收到,我应该等待5毫秒(因为UDP不保证数据包的顺序),如果数据报“X-1”仍未收到,我应该回收

怎么做?我希望在收到数据包时为数据中的每个接收数据包存储“时间戳”。后来我想比较当前时间和时间戳,如果差异超过5毫秒且数据包X-1丢失,我应该恢复。

可能你可以推荐另一种算法吗?

或者如果我很好,我如何将“当前时间”转换为“int”或“long”毫秒?我不想使用DateTime.Now对象,因为它包含了很多我不需要的垃圾,而且我需要每秒处理几千次。

3 个答案:

答案 0 :(得分:8)

DateTime.Now实际上并没有“包含大量垃圾” - 它只是一个包含ulong的值类型。我会实际上建议您使用Stopwatch,因为这是一种更合适的类型,用于及时衡量差异。 (正如评论中所述,DateTime.Now的实际准确度对你来说太低了。)

我个人建议为你需要的每一个创建一个秒表,但你可以只使用一个。 (提示:每秒分配“几千个”对象对于.NET来说不是问题... 证明在你转向更复杂的事情之前,最简单的解决方案太慢了。)

当然,Stopwatch处理测量时间而非等待时间。现在还不清楚你在这种情况下“恢复”是什么意思 - 你肯定需要采取一些行动,或者你能等到下一个数据报进来吗?如果可能的话,我会让代码被动,在每个数据包到达时做“正确的事”,使用秒表来计算一个数据包与下一个数据包之间的差异,如果有必要的话。

出于测试目的,您可能希望将秒表包装在界面中,以便您可以注入测试双。

答案 1 :(得分:2)

Socket(或udpClient.Client)具有可以使用它的属性ReceiveTimeout。 DateTime还有DateTime.Now.Ticks,可以用作时间戳(或静态长作为序列计数器)。

答案 2 :(得分:0)

如果我没记错的话,

Environment.TickCount 最快的调用,但可能产生最多的问题 - 它是一个整数(32位)的数字机器重启后的毫秒数。它会每隔几个月溢出一次,因此请确保在计算差异时,允许该数字为负数并将其考虑在内。

有关详细说明,请参阅http://msdn.microsoft.com/en-us/library/system.environment.tickcount.aspx

Thist post对每种方法,精度和他们调用的WinAPI都有很好的描述