2
我正在編寫一個處理來自多個連接的傳入數據的Node.js中的TCP服務器。 服務器解析傳入的數據流並返回存儲在數據庫中的對象。 我試圖做一些性能優化,並測試了兩種編碼方法:節點js事件偵聽器。使用匿名回調函數或聲明的函數來獲得性能?
- 代碼段1使用嵌套的匿名回調。
- 代碼段2使用聲明 函數來替換匿名回調函數。
我認爲snippet 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);
我有點困惑。當「stream」僅存在於「TcpOnConnection」範圍內時,「this」如何引用「stream」? parseTcp函數不知道流對象。在成功解析結束時,parseTcp只是簡單地調用「handleParsed」回調。 –
@SeppVanRompaey對,雖然'StreamOnData'應該設置爲'stream',所以也許你可以從那裏傳遞它呢? – Esailija
@SeppVanRompaey'this'取決於函數的調用方式,而不是範圍。流應該調用數據回調,比如'.call(this,data)',然後'this'將引用回調中的'stream'。就像jQuery或DOM事件偵聽器通過'.calling'工作,'this'設置爲事件的元素目標。 – Esailija