我写了一个简单的tcp服务器应用程序,其中我读取的fd_set包含连接套接字描述符。只要收到消息,服务器应用程序就会发送一个ACK。客户端应用程序收到服务器的ACK后才发送下一条消息。linux选择性能场景
// timeval == NULL
select(maxfd, &read_set, NULL, NULL, NULL)
当我这样做时,性能约为3K信息/秒。发送ack和从客户端接收响应之间的延迟时间为0.3ms。
// tm.tv_sec=0 and tm.tv_usec=0
select(maxfd, &read_set, NULL, NULL, tm)
但是,如果我这样做,性能会达到8K信息/秒,延迟下降到0.18毫秒。
在后一种情况下,select变成一个轮询。有人能解释为什么后一种情况比第一种情况好得多吗?
退房[ epoll](http://linux.die.net/man/7/epoll),如果你担心延迟。至于差异,它们是否一致?也许你可以阅读libc/kernel源代码,看看它有什么不同。 –
就像工程中的一切,这是一个折衷。从* system *的角度来看,“select(...,NULL)”在几乎所有情况下都是明显的胜利:它能及时响应;它不占用系统资源。然而在你的情况下,“select(...,tm = 0)”表现更好。为什么? 1),因为你有一个*连续*的网络流量,并且2)响应网络是你所关心的。 – paulsm4