Node.js パフォーマンス高速化の為の10個のヒント

nodejs-logo

Node.js を最近始めました。レスポンスが凄く早くてサクサク気持ちいいです!
リアルタイムが求められるWebアプリケーションには適していると思います。

そんなNode.js を更に高速化する為の10個のヒントを紹介します。

1. 同期コードを避ける

例えば、多くのファイルシステム操作は、非同期やWriteFileおよびwriteFileSyncなどの同期バージョンの両方を持っている。
あなた自身のコード内で同期メソッドを避ける場合であっても、それは誤ってブロッキング呼び出しを持っている外部ライブラリを使用することも可能です。
この操作を行うと、パフォーマンスへの影響は劇的です。

// Good: ファイルを非同期で書き込む
fs.writeFile('message.txt', 'Hello Node', function (err) {
  console.log("It's saved and the server remains responsive!");
});

// BAD: ファイルを同期で書き込む
fs.writeFileSync('message.txt', 'Hello Node');
console.log("It's saved, but you just blocked ALL requests!");

2. ソケットプーリングをオフにする

Node.js HTTPクライアントは、自動的にソケットプーリング使用しています。
それは深刻なボトルネックになります。これらのシナリオで、それはmaxSocketsを増やしたり、完全にソケットプーリングを無効にすることをお勧めします。

// Disable socket pooling

var http = require('http');
var options = {.....};
options.agent = false;
var req = http.request(options)

3. 静的ファイルにはNode.jsを使用しないでください

CSSや画像などの静的ファイルの場合は、Node.jsの標準的なWebサーバは使用しない。代わりに例えば、nginx等を使用します。
また、コンテンツデリバリーネットワーク(CDN)も活用する。これには2つの利点があります:
(1)Node.jsのサーバーの負荷を軽減し、
(2)CDNは、静的コンテンツが遅延を低減、ユーザーの近いサーバから配信することができます。

4. クライアント側でレンダリングする

簡単にページのサーバー側とクライアント側のレンダリングを比較してみましょう。

<!-- 簡単なWebページの例は、完全にサーバー側でのレンダリング -->

<!DOCTYPE html>
<html>
  <head>
    <title>Node.js</title>
  </head>
  <body>
    <div class="header">
      <img src="http://example.com/images/example.png" alt=""/>
    </div>
    <div class="body">
      Hello John!
    </div>
  </body>
</html>

ユーザーの名前を除いて、静的であることに注意してください:
効率的なアプローチは、Node.jsがJSONとしてページに必要な動的データのみを返すようにすることです。

// return json data.
{"name": "John"}

ページの残りの部分 – 全て静的なHTMLマークアップは、 – JavaScriptのテンプレートに入れることができます。

<!-- クライアント側でレンダリングすることができるJavaScriptのテンプレートの例 -->

<!DOCTYPE html>
<html>
  <head>
    <title>Node.js</title>
  </head>
  <body>
    <div class="header">
      <img src="http://example.com/images/example.png" alt=""/>
    </div>
    <div class="body">
      Hello <%= name %>!
    </div>
  </body>
</html>

5. gzipを使用してください

ほとんどのサーバーとクライアントは、要求と応答の圧縮にはgzip形式をサポートしています。

6. 並列処理を活用してください

すべてのブロッキング操作を並列に実行してみてください
それは、リモートサービス、DBの呼び出し、およびファイルシステムへのアクセスへの要求です。
これはどちらかというと、シーケンス内のそれぞれの合計よりもブロック操作の遅いものまで待ち時間が削減されます。
コールバックとエラー処理を清潔に保つために、フロー制御のためのステップを使用してください。

7. Go session-free

リクエスト/レスポンスのサイクルを管理するためのフレームワークの
ほとんどの例では次の設定が含まれています。

app.use(express.session({ secret: "keyboard cat" }));

デフォルトでは、セッションデータはメモリに格納されています。
MongoDBやRedisのような外部セッションストアに切り替えることもできますが、
セッションのデータをフェッチするリモート呼び出しのオーバーヘッドが生じることになります。
可能であれば、最良のオプションは、すべてにおいて、サーバー側では状態を保存しないことです。
セッション設定上記の明示を含めないことにより自由に移動し、より良いパフォーマンスを得ることができます。

8. バイナリモジュールを使用

使用可能な場合、バイナリのモジュールを使用してください。例えば、Node.jsが付属してコンパイルされたバージョンにJavaScriptで記述されたSHAモジュールから切り替えたときに、大きなパフォーマンスの改善が見られた。

// Use built in or binary modules
var crypto = require('crypto');
var hash = crypto.createHmac("sha1",key).update(signatureBase).digest("base64");

9. クライアント側のライブラリの代わりに、標準的なV8のJavaScriptを使用

クライアント側のライブラリは通常、ブラウザの違いを克服するために非効率的なコードがたくさんある。
クライアントライブラリの代わりに直接標準的なV8の機能を使用することにより、大幅なパフォーマンス向上が表示されることがあります。

10. コードはシンプル、軽量をキープしてください

シンプル、軽量をキープするには以下のような質問をする:
“実際にこのモジュールが必要ですか?”
“なぜこのフレームワークを使用している?オーバーヘッドの価値がある?”
“単純な方法でこれを行うことはできますか?”

小型、軽量化コードは通常、より効率的で高速です。

PHP, Perl, Python, Ruby 文法などの比較まとめチートシート

プログラミング言語の比較対応で文法覚えられそうなんで便利!

* Big Script: PHP, Perl, Python, Ruby, Smalltalk
http://hyperpolyglot.wikidot.com/scripting

* Small Script: Bash, Tcl, Lua, Javascript, IO
http://hyperpolyglot.wikidot.com/small

* Platform: C, C++, Objective C, Java, C#
http://hyperpolyglot.wikidot.com/platform

webpod(iPod)の使い方及び設置方法

webpod(iPod)という面白いWEBアプリを見つけたので使用方法等をご紹介。

webpod

ダウンロード先はこちら:
http://www.search-this.com/tools/webpod/

1.まずは上記ダウンロード先からzipファイルをダウンロードし解凍します。

2.次に、二つのスクリプトタグを タグの間にコピペします。

<script type="text/javascript" src="swfobject.js" ></script>
<script type="text/javascript" src="js-to-flash.js" ></script>

3.webPodを表示させたい場所に下記のコードをコピペします。

   <div id="flashcontent" style="text-align:center;">
         webPodを使うためにアドビからFlashプレーヤーをダウンロードする必要があります。
   </div>
   <script type="text/javascript">
   var so = new SWFObject("webPod.swf", "webPod", "165", "265", "8", "#ffffff");
   so.addParam("quality", "best");
   so.addParam("wmode", "transparent");
   so.addParam("flashvars", "xmlFile=tunes.xml");
   so.write("flashcontent");
   </script>

・webPod.swfファイルへのパスは適宜変更して下さい。(解凍したままアップロードするのであれば、変更は必要ありません。)

・もし、webPod-slimを使っているならば、webPod.swfからwebPod-slim.swfに上記のコードを変えて、165から125に幅を変えてください。

・flashvars「xmlFile=tunes.xml」のパスも適宜変更して下さい。(解凍したままアップロードするのであれば、変更は必要ありません。)

4.playSongメソッドのリンクを作ります。

<a href="javascript:playSong('Lost Someone')">Lost Someone</a>

tunes.xmlファイルで指定したタイトルと曲名が同一であることを確認してください。これは大文字と小文字の区別されますので注意して下さい。

5.最後にMP3ファイルをアップロードして、tunes.xmlファイルを修正します。

tunes.xmlファイルの書式参考です。

<tunes>
  <tune>
    <mp3>http://domain.com/music/song.mp3</mp3>
    <title>Lost Someone</title>
    <artist>James Brown</artist>
    <album>Live At The Apollo (1962)</album>
    <bitrate>192</bitrate>
    <image></image>
    <link>http://www.link.com</link>
  </tune>
</tunes>

実際に設置してみたサンプルページはこちらです:
http://blog.96q.org/webpod-ipod-sample/