使用socket.io广播的效率与向每个客户端发送消息的效率相同

我想优化一些代码,一个节点服务器,发送消息给许多客户端。 现在它向所有客户端广播,即使只需要发送消息给其中的一小部分。 这在正确性方面没有任何坏处,但是服务器在效率方面正在努力处理这么多的消息。 我正在考虑编写一些代码,以确保它只发送给需要它的客户端。 但是,我不确定这是否更有效率。

假设发送消息需要X运算。 假设有N个客户端连接。 广播那么就拿N * X总计算? 或者也许是广播优化所以计算较less? 这是我的问题。

只是为了定义广播和单个消息的含义,这里有一些代码。 请注意,这个代码只是明确地定义操作:

var io = require('socket.io')(80); io.on('connection', function (socket) { io.emit('this', { will: 'be received by everyone'}); // broadcast }); io.on('connection', function (socket) { socket.emit('news', { hello: 'world' }); // single message }); 

广播到所有连接的客户端或房间中的所有客户端无非是发送一个单独的消息到每个客户端。 socket.io API中的“广播”语义只是一个API方便。 与自己向每个相同的客户端发送消息相比(或者不同)效率更高。

假设发送消息需要X运算。 假设有N个客户端连接。 广播那么就拿N * X总计算?

是的,它确实。 这将是N * X。 计算主要是发送消息和接收TCP数据包确认的TCP套接字开销。 在创buildwebSocket数据包时有less量的CPU开销,但并不多。 如果你通过SSL运行,那么也会有一些encryption开销。

或者也许是广播优化所以计算较less?

不,它仍然是发送给每个客户端的循环。 执行你自己的循环可能比构build在socket.io的.broadcast()的循环效率低一些,但是可能不会有太大的差别。

让代码更高效的最好方法是只发送给实际需要消息的客户端。


要查看循环中实际的.broadcast() socket.io代码的引用,请参阅此答案: room broadcast vs sockets emit – 它们是否相同? 。 还有一个类似的问题: 最佳性能 – 通过循环或房间发送到套接字 。