読み取り用の fd_set に接続ソケット記述子が含まれている単純な tcp サーバー アプリケーションを作成しました。サーバー アプリケーションは、メッセージを受信するたびに ACK を送信するだけです。クライアント アプリケーションは、サーバーから ACK を受信した後、次のメッセージのみを送信します。
// 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)
しかし、これを行うと、パフォーマンスは 8,000 メッセージ/秒になり、レイテンシは 0.18 ミリ秒に低下します。
後者の場合、select は poll になります。後者のケースが最初のケースよりもはるかに優れている理由を誰か説明してもらえますか?