【发布时间】:2014-03-09 00:34:52
【问题描述】:
我目前正在使用 Node.js,并且已经构建了一个接受数据的套接字。我正在尝试以流式方式处理数据,这意味着我(几乎)在收到数据时处理数据。但是,我的代码中有一个相当大的瓶颈,这使我无法按我的意愿快速处理。
我已将问题提炼到下面的代码中,删除了无关信息,但它很好地捕捉到了我的问题:
require('net').createServer(function (socket) {
var foo = [];
socket.on('data', function (data) {
foo.push(data); // Accessing 'foo' causes a bottle neck
});
}).listen(8080);
更改data 事件中的代码可显着提高性能:
var tmpFoo = foo;
tmpFoo.push(data);
// Do work on tmpFoo
问题是,我最终需要访问全局 (?) 变量(为下一个data 事件保存信息);随之而来的是性能损失。我更愿意在收到数据时对其进行处理,但似乎无法保证它将是“完整”消息,因此我需要缓冲。
所以我的问题:
- 是否有更好的方法来本地化变量并限制性能损失?
- 有没有更好的方法以流方式处理数据?
【问题讨论】:
-
tmpFoo 和 foo 是一样的,所以如果你 push 到 tmpFoo,它也会在 foo 中...
-
你怎么知道非本地引用会导致“瓶颈”?你是怎么测量的?我觉得这不太可能。它肯定比访问局部变量更昂贵,但时间量以几微秒为单位。
-
@Pointy 是的,我已经测量过了。虽然对于任何给定事件来说这只是最小的延迟,但我正在处理的速度/数据吞吐量会导致这种延迟迅速增加。
-
这看起来有点难以置信——
tmpFoo只是一个指向foo的指针,所以它仍然需要像foo一样在执行tmpFoo.push时取消引用。如果有的话,考虑到设置指针所需的额外指令,我认为使用 temp 变量会更慢。你如何衡量绩效?你确定只更改那行代码吗? -
我也不认为这是个问题,所以在到达这条线之前我跑了几个兔子洞。我认为这是我在
foo上进行的处理,所以我将其注释掉 - 相同的性能。我一注释掉对foo的访问权限,它就立即加快了速度。本地化变量(即tmpFoo)保持了速度的提高,但在下一次迭代中丢失了数据。
标签: javascript node.js performance-testing