更快地处理WebSocket数据



所以我从网站的websocket获取数据(JSON格式(。它是有效的,但问题是处理这些数据并不像我希望的那样高效(每毫秒都很重要(。目前我的处理程序如下:

var events_channel = pusher.subscribe('changes');
const eventsQueue = [];
events_channel.bind('channel1', function(data)
{
eventsQueue.push(data);
handleNewEvent();
});
events_channel.bind('channel2', function(data)
{
eventsQueue.push(data);
handleNewEvent();
});

let processingEvent = false;
function handleNewEvent() 
{
if(processingEvent){return;}
processingEvent = true;
const eventData = eventsQueue.shift();
if(!eventData){processingEvent = false; return;}
//Parse the data and do some other stuff with it
processingEvent = false;
handleNewEvent();
return;
}

我对websocket在服务器端的工作方式没有发言权,所以我想知道是否有办法多节省一两毫秒,或者这基本上是关于我可以在效率方面做什么。

首先,我不认为有必要递归调用"handleNewEvent",这可能会让你很痛苦。

这里会想到一些事情:

  • 移位数组的性能比只使用.pop((差得多如果你没有遇到高负载或每秒有太多
    消息,这可能很好,但可能会让你不知所措。考虑写一个根据您的需要定制的自定义队列。

  • 如果您可以假设消息始终具有同样的格式,您可以为消息编写一个自定义解析器。只是使用固定偏移来索引某些零件。这应该优于性能JSON.parse,但请注意,您需要绝对确保
    格式永远不会更改。根据我的经验,JSON.parse花费了~2
    微秒,这是非常非常难以击败的,即使有索引直接进入缓冲区/字符串。

  • 尽量不要在热路径上分配新对象(预先分配
    所需内容(,之后也不要更改这些对象的字段
    (这将触发新的隐藏类,从而降低
    性能(。

  • 最后,V8可以优化总是采用相同类型的输入有时最好为在不同类型上操作,而不是使用多态
    函数。V8也将尽可能开始直列。

毕竟,请记住过早优化。编写代码,进行基准测试,改进缓慢的部分并重复。如果你真的关心性能,你可能会更好地使用一种能让你更好地控制的语言。在节点中,您将在某个时刻与GC和V8进行斗争。

最新更新