Ric*_*uly 5 websocket node.js socket.io
我想优化一些代码,一个节点服务器,向许多客户端发送消息。现在,即使它只需要向其中一小部分客户端发送消息,它也会向所有客户端广播。这在正确性方面没有什么坏处,但在效率方面服务器正在努力处理如此多的消息。我正在考虑编写一些代码以确保它只发送给需要它的客户。但是,我不确定这是否更有效。
假设发送消息需要X计算。假设有 N 个客户端连接。那么广播是否需要 N*X 的总计算量?或者也许广播经过优化,因此计算量更少?这就是我的问题。
只是为了定义广播和单个消息的含义,这里有一些代码。请注意,此代码只是为了清楚地定义操作:
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
});
Run Code Online (Sandbox Code Playgroud)
向所有连接的客户端或房间中的所有客户端广播只不过是向每个客户端发送单独的消息。socket.io API 中的“广播”语义只是为了方便使用 API。它并不比您自己向每个相同的客户端发送消息更有效(或不同)。
假设发送消息需要X计算。假设有 N 个客户端连接。那么广播是否需要 N*X 的总计算量?
是的,它确实。这将是 N*X。计算主要是发送消息和接收回 TCP 数据包确认的 TCP 套接字开销。创建 webSocket 数据包会产生少量 CPU 开销,但不多。如果您通过 SSL 运行,那么也会有一些加密开销。
或者也许广播经过优化,因此计算量更少?
不,它仍然是一个循环发送到每个单独的客户端。执行您自己的循环可能比 socket.io 中内置的循环效率更高或更低.broadcast(),但可能不会有太大差异。
提高代码效率的最佳方法是仅发送给真正需要消息的客户端。
.broadcast()要查看有关循环的实际 socket.io 代码的参考,请参阅此答案:房间广播与套接字发出 - 它们相同吗?。并且,另一个类似的问题:最佳性能 - 通过循环或房间发送到套接字。
| 归档时间: |
|
| 查看次数: |
1411 次 |
| 最近记录: |