更快地处理 WebSocket 数据

Handling WebSocket Data Faster

所以我从网站的 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
    微秒,这是非常非常难以击败的,即使有索引 直接变成buffer/string.

  • 尽量不要在热路径上分配新对象(预分配什么
    你需要)并且之后不要更改这些对象的字段
    (这将触发新的 hidden classes 可以降级
    性能)。

  • 最后,V8可以优化总是采用相同类型的函数 输入。有时最好为 在不同类型上操作而不是使用 polymorphic
    函数
    。 V8 也会尽可能地开始内联。

毕竟,记住过早的优化。编写代码、基准测试、改进慢速部分并重复。而且,如果您真的关心性能,那么最好使用一种可以更好地控制的语言。在节点中,你最终会在某个时候与 GC 和 V8 作斗争。