节点js事件监听器。 使用匿名callback或声明的function性能?

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

  • 代码片段1使用嵌套的匿名callback。
  • 代码片断2使用声明的函数来replace匿名callback。

我认为snippet 2会更快,因为它避免了为每个新的传入数据包创build新的函数对象。 然而,在现实生活中,代码片段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); 

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

函数是一stream的对象,不pipe怎样,每个函数都必须创build一个单独的对象。

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

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