2012-07-29 37 views
6

Socket.ioの例すべてこのパターン最も効率的な方法のハンドラ

io.sockets.on("connection", function(mySocket){ 
    mySocket.on("my message", function(myData){ 
     ... 
    }); 
}); 

に従うすべての接続のための新しいコールバック関数を作成するだろうと私には思えます。

function myMessageHandler(data){ 
    ... 
} 

io.sockets.on("connection", function(mySocket){ 
    mySocket.on("my message", myMessageHandler); 
}); 

かさえ、この:すべてのソケットが同じ方法でメッセージに応答すると仮定すると、このようなすべてのソケットに対して一度ハンドラを定義するために、より多くのメモリ効率的ではないでしょう

io.sockets.on("my message", function(mySocket, myData){ 
    ... 
}); 

もしそうなら、なぜSocket.ioはメモリを浪費する習慣を勧めますか?私たちはソケットのステートフルな変数を "接続"コールバックの終了の中に保存したいと思っていますか?

+2

「時期尚早の最適化」として知られているそのような不安な形態の心配に夢中になります。オーバーヘッドの差によってアプリケーションが作成または中断された場合、node.jsは誤ったプラットフォームの選択です。 – ebohlman

+0

私のアプリケーションロジックは、数十のソケットメッセージで実行され、何千もの同時接続に対応しています。各接続が何千ものコールバック行を複製すると、それは私にとって大きな最適な見落としに見えます – arkanciscan

答えて

0

別の観点から見ると、最初の形式は読みやすいです(多くの詳細は除外されているため)。私は、このフォームがライブラリの仕組みを最もよく表していると思います。同様のスタイルが同じ理由でノードのウェブサイト自体で使用されていると私は信じている。そして、私はそれがなぜそれらの場所で使われているのかということです。

ブログを読んで数分後に、開発者は通常、名前付き機能を渡すことを選択していることが示唆されています。私はそれにパフォーマンスの向上があると確信していますが、主要な動機は間違いなく読みやすさです。私はあなたの関数が成長するにつれてより簡単に作業できるように、2番目のフォーム(またはより抽象的なフォーム)を見つけると思います。

関連する問題