更快地处理WebSocket数据

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了更快地处理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微秒,即使索引也很难克服直接放入缓冲区/字符串。

  • 尝试在热路径上不分配新对象(预先分配什么您需要),然后不要更改这些对象的字段(这会触发新的hidden classes性能)。

  • 最后,V8可以优化始终采用相同类型的输入。有时最好为操作不同的类型,而不是使用polymorphic functions。 V8也将尽可能开始内联。

毕竟,请记住过早的优化。编写代码,进行基准测试,改进较慢的部分并重复。而且,如果您真的在乎性能,那么最好使用一种可以提供更好控制的语言。在节点中,您最终将在某个时候与GC和V8战斗。

以上是关于更快地处理WebSocket数据的主要内容,如果未能解决你的问题,请参考以下文章

Nodejs Websocket关闭事件调用......最终

我们一起来聊聊websocket

在 R 中更快地获得 randomForest 回归

更快地处理 URL Python

更快地在新列 pandas 中添加未来间隔

在 datagridview 上加载数据的更快方法?