暂停线程不到一毫秒

mjn*_*mjn 14 delphi messaging multithreading sleep

在消息传递客户端测试应用程序中,需要限制生产者线程以避免泛滥服务器.

由于传输速率约为每秒25,000条消息(每条消息40微秒),因此睡眠(1)引起的延迟时间太长.

如何在Windows上使线程休眠不到一毫秒包含一些与Windows API相关的信息.是否有Delphi的代码片段,类或库?


按照Bens的回答,我发现不同值低于15的睡眠也会提供不同的传输速率(Windows Vista):

每20条消息后休眠(1):

00:02 tx/rx 25740/3705 12831/1846 msgs/sec (77/541 microsecs/msg)
00:04 tx/rx 53101/7405 13255/1848 msgs/sec (75/541 microsecs/msg)
00:06 tx/rx 79640/11288 13260/1879 msgs/sec (75/532 microsecs/msg)
00:08 tx/rx 104520/14562 13055/1818 msgs/sec (76/550 microsecs/msg)
00:10 tx/rx 130760/18829 13066/1881 msgs/sec (76/531 microsecs/msg)
Run Code Online (Sandbox Code Playgroud)

每20条消息后睡觉(5):

00:02 tx/rx 7640/3622 3812/1807 msgs/sec (262/553 microsecs/msg)
00:04 tx/rx 14660/10794 3661/2695 msgs/sec (273/371 microsecs/msg)
00:06 tx/rx 21480/18171 3577/3026 msgs/sec (279/330 microsecs/msg)
00:08 tx/rx 28140/25642 3515/3203 msgs/sec (284/312 microsecs/msg)
00:10 tx/rx 34980/32692 3496/3267 msgs/sec (286/306 microsecs/msg)
Run Code Online (Sandbox Code Playgroud)

在阅读有关忙碌等待下限的评论后,这是意料之外的

并且没有节流的价值观

00:02 tx/rx 44065/494 21988/246 msgs/sec (45/4065 microsecs/msg)
00:04 tx/rx 90493/756 22595/188 msgs/sec (44/5319 microsecs/msg)
00:06 tx/rx 142982/907 23810/151 msgs/sec (41/6622 microsecs/msg)
00:08 tx/rx 192562/1144 24055/142 msgs/sec (41/7042 microsecs/msg)
00:10 tx/rx 237294/1395 23717/139 msgs/sec (42/7194 microsecs/msg)
Run Code Online (Sandbox Code Playgroud)

Ben*_*igt 21

发送20条消息,然后睡眠1毫秒?

除非您有系统计时器以外的硬件中断,否则您的睡眠时间少于调度程序量程.阅读您链接的问题中的答案,他们解释了为什么建议的方法实际上不起作用.

即使使用这种方法,您可能会睡眠时间超过1毫秒,或者由于消息不会立即发送,因此整个操作肯定需要超过1毫秒,从而降低整体速率.

因此,每次唤醒时都要检查精确时钟源,并根据经过的时间计算要发送的消息数量,不要使用常数20.

  • 在Windows上,我推荐QueryPerformanceCounter(http://msdn.microsoft.com/en-us/library/windows/desktop/ms644904(v=vs.85).aspx)作为精确时钟源(分辨率约为半微秒). (3认同)

Dav*_*rtz 12

1)获取当前时间.

2)根据您发送的数量以及自那时以来经过的时间计算您需要发送的邮件数量.

3)发送那么多消息.

4)尽可能少地睡觉.

5)转到步骤1.