Node js事件监听器.使用匿名回调或声明函数来提高性能

node js event listeners. Use anonymous callbacks or declared functions for performance?

本文关键字:声明 函数 高性能 回调 事件 js 监听器 Node      更新时间:2023-09-26

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

    片段1使用嵌套的匿名回调。
  • 代码片段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);

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

函数是一级对象,它的缺点是无论如何都必须为每个函数创建单独的对象。

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

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);