gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 11:31:37 24 4
gpt4 key购买 nike

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

假设发送一条消息需要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
});

最佳答案

向所有连接的客户端或房间中的所有客户端广播只不过是向每个客户端发送单独的消息。 socket.io API 中的“广播”语义只是为了方便使用 API。它并不比您自己向每个相同的客户端发送消息更有效(或不同)。

Supposing that sending a message takes X computation. Suppose there are N clients connected. Does broadcasting then take N*X total computation?

是的,确实如此。这将是 N*X。计算主要是发送消息和接收回 TCP 数据包确认的 TCP 套接字开销。创建 webSocket 数据包会产生少量 CPU 开销,但不多。如果您通过 SSL 运行,那么也会有一些加密开销。

Or perhaps is broadcasting optimized so the computation is less?

不,它仍然是一个循环发送到每个单独的客户端。执行您自己的循环可能比 socket.io 的 .broadcast() 中内置的循环效率稍高,但可能不会有太大差异。

提高代码效率的最佳方法是仅发送给真正需要消息的客户端。

<小时/>

要查看循环的实际 .broadcast() socket.io 代码的引用,请参阅此答案:room broadcast vs sockets emit - are they the same? 。并且,另一个类似的问题:Best Performance - emit to sockets via a loop or rooms

关于node.js - 使用socket.io 广播的效率与向每个客户端发送消息的效率相同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45091468/

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