我认为我优化了以下代码,因为当没有可用数据时它会Sleep(1)
,因此会产生高达15.6毫秒的延迟(生产中盒子上的实际计时器分辨率) ,浪费时间睡觉,而它可能正在处理数据包。
while (running)
{
int available = _udpClient.Available;
if (available > 0)
{
byte[] packet = _udpClient.Receive(ref serverEndPoint);
_concurrentJobQueue.Enqueue(packet);
if (available > x)
LogSomething(available);
}
else
{
Thread.Sleep(1);
}
}
由于UdpClient
提供了阻止Receive()
,这看起来很容易:
while (running)
{
byte[] packet = _udpClient.Receive(ref serverEndPoint);
_concurrentJobQueue.Enqueue(packet);
int available = _udpClient.Available;
if (available > x)
LogSomething(available);
}
现在Receive()
应该正在进行所有休眠,如果有效实施,它会在数据包到达时立即唤醒。
这应该
然而,当以每秒10k的速率发送100k数据包时,"优化&#34>版本比原始版本密集得多 - 以下结果来自于计时器分辨率为1毫秒的机器上的测试,因此原始版本仅为"仅#34;如果没有可用数据包,则睡1ms:
test case avg cpu (%)
------------+------------
original 0.81427075
"optimized" 16.8082852
为什么阻止Receive()
阻塞cpu的次数超过20次?
注意:
UdpClient
个,每个UdpClient
的1个主题正在运行上述while
循环Sleep
会影响我创建"传入时间戳的时间&# 34)