Node js事件监听器.使用匿名回调或声明函数来提高性能
node js event listeners. Use anonymous callbacks or declared functions for performance?
我在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);
相关文章:
- Eval未声明函数
- JavaScript + mocha:可能是在 for 循环中声明函数的闭包问题
- 使用 .on 函数运行 jQuery 声明函数
- 返回并重新声明函数中的变量
- SyntaxError:严格模式不允许在词法嵌套语句中声明函数
- JavaScript函数的类型是在声明函数之前定义的
- 在 initComponent Ext JS4 中声明函数
- 在对象中声明函数名称,为什么
- 在变量中声明函数的不同方法
- 声明函数是否会创建具有函数名称和分配给它的函数对象的变量
- 在 angularjs 控制器范围内声明函数和属性,但不附加到$scope
- 在声明函数中使用“this”时严格违规,函数表达式不违规
- 只有从html set onclick事件调用代码声明函数时,该函数才不存在
- 在jQuery中动态声明函数
- 声明函数并在jquery事件绑定上调用它
- 在Javascript中声明函数的最有效方法是什么
- javascript声明函数超时
- Javascript:动态声明函数的正确方法
- 为闭包声明函数两次
- 习语Javascript编码风格-何时在原型上声明函数,何时在函数构造函数内声明函数