node js事件监听器。使用匿名回调或声明的函数来提高性能?

时间:2013-06-21 09:10:19

标签: javascript performance node.js optimization

我正在Node.js中编写一个TCP服务器来处理来自多个连接的传入数据。 服务器解析传入的数据流并返回存储在数据库中的对象。 我正在尝试对性能进行一些优化,并测试了两种编码实践:

  • Snippet 1使用嵌套的匿名回调。
  • 使用了Snippet 2声明 用于替换匿名回调的函数。

我认为代码片段2会更快,因为它避免了为每个新的传入数据包创建新的函数对象。 但是,在现实生活中,代码片段1似乎快了20%。

有谁知道为什么?

摘录1:

function TcpOnConnection (stream) {
    stream.on("data", function(data) {      
      parseTcp(data,function(err,obj) {             
        if (err) console.log(err.message);
        if (obj) {
           stream.write(obj.returnMsg); 
           storeData(obj);
        }
      });
    });
}
TCPserver.on("connection",TcpOnConnection);

摘录2:

function TcpOnConnection (stream) {
    function  handleParsed(err,obj) {               
      if (err) console.log(err.message);
      if (obj) {
        stream.write(obj.returnMsg);    
        storeData(obj);
      }                 
    }

    function StreamOnData(data) {
      parseTcp(data,handleParsed);              
    }

    stream.on("data", StreamOnData);
}
TCPserver.on("connection",TcpOnConnection);

1 个答案:

答案 0 :(得分:1)

函数声明不会因为它是函数声明而避免创建新的函数对象或闭包 - 它们在这方面具有相同的机制。事实上,你不仅要创建一个函数对象,还要创建一个常规对象(每个函数都带有一个可以用.prototype引用的新对象,尽管至少在V8中它似乎只在需要时才创建) 。

函数是第一类对象,无论如何都必须为每个函数创建一个单独的对象。

确保所有功能都在模块范围内或在a内创建 每个应用程序只执行一次的函数:

function handleParsed( err, obj ) {
  if (err) console.log(err.message);
  if (obj) {
    //What I'm doing here is only possible if 
    //`this` refers to the stream
    //That depends how parseTcp calls the callback
    this.write(obj.returnMsg);
    storeData(obj);
  }
}

function StreamOnData( data ) {
    parseTcp( data, handleParsed );    
}

function TcpOnConnection (stream) {
    stream.on("data", StreamOnData);
}
TCPserver.on("connection",TcpOnConnection);