2

複数の接続からの着信データを処理する Node.js で TCP サーバーを作成しています。サーバーは受信データ ストリームを解析し、データベースに格納されているオブジェクトを返します。私はパフォーマンスの最適化を試みており、次の 2 つのコーディング プラクティスをテストしています。

  • スニペット 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);
4

1 に答える 1

1

関数宣言は、関数宣言であるという理由だけで、新しい関数オブジェクトまたはクロージャーの作成を回避するものではありません。この点に関して、それらは同じメカニズムを持っています。実際、関数オブジェクトだけでなく、通常のオブジェクトも作成しています (各関数には、 で参照できる新しいオブジェクトが付属していますが.prototype、少なくとも V8 では、必要な場合にのみ作成されるようです)。

関数は第一級のオブジェクトであり、関数ごとに個別のオブジェクトを作成しなければならないという欠点があります。

すべての関数が、モジュール スコープまたはアプリケーションごとに 1 回だけ実行される関数内で作成されていることを確認してください。

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);
于 2013-06-21T09:37:31.837 に答える