更快地处理 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 作斗争。
所以我从网站的 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 作斗争。