我写了一个简单的TCP服务器应用程序,其中我的读取fd_set包括连接套接字描述符。当服务器应用程序收到消息时,它只是发送一个ACK。客户端应用程序只有在从服务器收到ACK后才会发送下一条消息。
// timeval == NULL
select(maxfd, &read_set, NULL, NULL, NULL)
当我这样做时,性能约为每秒3K条消息。发送确认和从客户端接收响应之间的延迟为0.3毫秒。
// tm.tv_sec=0 and tm.tv_usec=0
select(maxfd, &read_set, NULL, NULL, tm)
但如果我这样做,性能将达到8K条/秒,延迟降至0.18毫秒。
在后一种情况下,选择变成了轮询。有人能解释一下为什么后一种情况的表现比第一种情况要好得多吗?