我正在Node.js中编写一个TCP服务器来处理来自多个连接的传入数据。 服务器解析传入的数据流并返回存储在数据库中的对象。 我正在尝试对性能进行一些优化,并测试了两种编码实践:
我认为代码片段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);
答案 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);