更快地处理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数据的主要内容,如果未能解决你的问题,请参考以下文章