gpt4 book ai didi

c++ - select() 和 recv 与 MSG_PEEK 之间的效率。异步

转载 作者:搜寻专家 更新时间:2023-10-31 00:04:43 24 4
gpt4 key购买 nike

我想知道在检查传入数据(异步)时什么是最有效的。假设我有 500 个连接。我有 3 个场景(我能想到):

  1. 使用 select() 一次检查 FD_SETSIZE 套接字,然后遍历所有套接字以接收数据。 (这不会需要为每个返回的套接字调用两次 recv 吗?MSG_PEEK 分配一个缓冲区,然后再次 recv() 它,这与 #3 相同)
  2. 使用 select() 一次检查一个套接字。 (这不会像#3 一样吗?它需要两次调用 recv。)
  3. 一次使用带有 MSG_PEEK 的 recv() 一个套接字,分配一个缓冲区,然后再次调用 recv()。这不是更好吗,因为我们可以跳过对 select() 的所有调用?还是一次 recv() 调用的开销太大?

我已经将情况编码为 1 和 2,但我不确定使用哪一个。对不起,如果我有点不清楚。

谢谢

最佳答案

FD_SETSIZE 通常为 1024,因此您可以一次检查所有 500 个连接。然后,您将执行两次 recv 调用,仅对那些准备就绪的 -- 例如,对于一个非常繁忙的系统,每次调用六个,例如.使用其他方法,您需要大约 500 个以上的系统调用(您在数百个套接字上执行的大量“失败”recvselect 调用,不会随时准备好!-)。

此外,使用方法 1,您可以阻塞,直到至少一个连接 就绪(在这种情况下没有开销,这在不是那么忙的系统中并不少见)- - 对于其他方法,您将需要“轮询”,即,搅动,持续不断地消耗大量 CPU 而无济于事(或者,如果您在每次循环后睡一会儿检查,然后您将延迟响应尽管系统根本不忙 -- eep!-)。

这就是为什么我认为轮询 是一种 模式:经常使用,但仍然具有破坏性。有时您绝对别无选择(这基本上告诉您您必须与设计非常糟糕的系统进行交互——唉,有时在这个不完美的生活中您确实必须这样做!-),但是当任何时候不错的选择确实存在,但是进行轮询确实是一种非常糟糕的设计实践,应该避免。

关于c++ - select() 和 recv 与 MSG_PEEK 之间的效率。异步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3664157/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com