JavaScript变量访问性能

JavaScript变量访问性能,javascript,node.js,performance-testing,Javascript,Node.js,Performance Testing,我目前正在使用Node.js,并构建了一个接受数据的套接字。我正在尝试以流式方式处理数据,这意味着我在接收数据时(几乎)会以最快的速度处理数据。然而,我的代码中有一个相当重要的瓶颈,它阻止我以我想要的速度处理 我已将问题提炼成以下代码,删除了无关信息,但它很好地抓住了我的问题: require('net').createServer(function (socket) { var foo = []; socket.on('data', function (data) {

我目前正在使用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);
数据
事件中更改代码,可显著提高性能:

var tmpFoo = foo;
tmpFoo.push(data);
// Do work on tmpFoo
问题是,我最终需要访问全局(?)变量(为下一个
数据
事件保存信息);同时也会导致性能损失。我更愿意在接收数据时对其进行处理,但似乎不能保证它是一条“完整”的消息,因此需要缓冲

所以我的问题是:

  • 是否有更好的方法来本地化变量并限制性能影响
  • 是否有更好的方式以流式方式处理数据

    • 不要使用这样的匿名功能:

       createServer(function (socket) {
      
      分别定义函数,并按如下方式调用这些函数:

       var foo = [];
      
       function createMyServer(socket) {    
            socket.on('data', reveiveDataFromSocket);
       }
      
       function reveiveDataFromSocket(data) {
            foo.push(data);
       }
      
       require('net').createServer(createMyServer).listen(8080);
      

      这个问题已经有六年历史了。在现代JavaScript运行时中,差别很小。该示例完全不同。在for循环中定义一个函数会在每次迭代中创建一个新函数,而将一个函数传递给createServer()只会创建一个函数,无论该函数被调用多少次。我同意使用命名函数是一种更好的做法,但并非出于所述的原因。在这种情况下,无论其年龄大小,这似乎都不相关。在OP的帖子中,每个函数只创建一次,这与您链接到的Q&A不同,在Q&A中,函数是在循环中创建的@Pointy-即使是在今天的Node中,我认为频繁创建函数的开销问题与编译器优化的潜在损失有关,根据他们给出的工程讲座(可以在线找到),大多数v8直到第二次运行函数时才适用-影响当然会随着功能复杂性的不同而变化。@尖刻-事实上,它很可能是共享的。为了好玩,我可能会拿出一个快速的基准。在简单的情况下(一个只需添加两个数字的函数),创建函数与只添加两个数字相比,其影响是每百万次调用0.037秒(在我的机器上,显然是0.002和0.039秒),因此我不会因此而失眠。:-)tmpFoo和foo是一样的,所以如果你推到tmpFoo,它也会在foo中…你怎么知道非本地引用会导致“瓶颈”?你是如何测量的?我觉得这不太可能;它当然比访问一个局部变量要昂贵,但要花费以微秒为单位的时间。@Pointy是的,我已经测量过了。虽然对于任何给定的事件来说这只是一个最小的延迟,但我正在处理的速度/数据吞吐量会导致这个延迟迅速增加。这似乎有点难以置信--
      tmpFoo
      只是指向
      foo
      的指针,所以它仍然需要像执行
      tmpFoo.push
      时的
      foo
      一样取消引用。如果有什么不同的话,我认为如果设置指针需要额外的指令,那么使用temp变量会更慢。你是如何衡量业绩的?你肯定只是在修改那一行代码吗?我也不认为这是个问题,所以在到达这一行之前,我跑了几个兔子洞。我想这是我在
      foo
      上做的处理,所以我把它注释掉了——性能相同。我一注释掉对
      foo
      的访问,它立刻加快了速度。本地化变量(即
      tmpFoo
      )保持了速度的提高,但在下一次迭代中丢失了数据。