SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

CoffeeScriptによるモダンなWebアプリケーション開発

CoffeeScriptベストプラクティス集
Node.jsアプリケーション編(4)

CoffeeScriptによるモダンなWebアプリケーション開発 第6回

  • X ポスト
  • このエントリーをはてなブックマークに追加

プロファイラ

 プログラムの開発が終了し、いざ本番環境で動かしてみると思ったより動作が遅いことがあります。しかし、プログラムが複雑になるにつれその原因を見つけるのは困難になります。プログラムの中でどの部分がボトルネックになっているのかを効率よく調べるにはプロファイラというツールを使います。

 v8-profilerというモジュールを使うと、node-inspector()と併用してプロファイラを使うことができます。v8-profilerをインストールするには、プロジェクトのディレクトリで次のコマンドを実行します。

$ npm install v8-profiler

 そして、プログラム中でリスト5の要領でプロファイラにデータを収集させます。

[リスト5]プロファイラで実行データを収集する
profiler = require 'v8-profiler'

fib = (n) ->
  if n < 2
    n
  else
    fib(n-1) + fib(n-2)

profiler.startProfiling 'prof1'  # prof1という名前で記録開始

result = fib 38
console.log result

profiler.stopProfiling 'prof1'   # 記録終了
debugger   # スクリプトが終了しないように一時停止する

 このリストを実行した時、profiler.startProfiling()からprofiler.stopProfiling()までのCPUプロファイル情報が収集されます。ここではプロファイル名としてprof1を指定していますが、指定する名前を変更することで、1つのプログラム内の複数箇所で同時にプロファイルを行うことができます。

 最後のプロファイル箇所の後ろに1つだけdebugger文を入れておき、ターミナルの別のタブでnode-inspectorを起動します。

$ node-inspector

 そして、プロファイル対象のプログラムを--nodejs --debug-brkというオプションを付けて実行します。

$ coffee --nodejs --debug-brk test.coffee
debugger listening on port 5858

 あるいは、nodeプログラムを直接起動する場合は--debug-brkオプションだけを付けます。

$ node --debug-brk test.js
debugger listening on port 5858

 ブラウザでhttp://0.0.0.0:8080/debug?port=5858を開くと図2のような画面になります。

図2 node-inspector
図2 node-inspector

 右上のボタンを押すとプログラムの実行が始まり、しばらくしてdebugger文に到達すると自動的に一時停止して図3の画面になります。

図3 debugger文で一時停止した状態
図3 debugger文で一時停止した状態

 ここで「Profiles」をクリックし、プロファイルを有効にすると図4のようなProfilesパネルが表示されます。

図4 Profilesパネル
図4 Profilesパネル

 右三角の印をクリックすると階層が現れます。この階層は、その関数がどの関数から呼ばれたのかをボトムアップ式に表しています。図4では、NativeModule.compileNativeModule.requireから呼ばれ、NativeModule.requirecreateWritableStdioStreamから呼ばれたことを示しています。

 下のバーにある「%」ボタンをクリックすると、実際にかかった時間での表示に切り替わります(図5)。「s」は秒、「ms」はミリ秒(1000分の1秒)を表します。

図5 実際にかかった時間での表示
図5 実際にかかった時間での表示

 「%」ボタンの左隣にある「Heavy (Bottom Up)」ボタンをクリックして「Tree (Top Down)」を選択すると階層が逆になり、トップダウン式の表示に切り替わります(図6)。

図6 トップダウン表示
図6 トップダウン表示

 「Self」の列に表示されている実行時間は、呼び出し先の関数の実行時間を含まず、その関数自身のコードの実行時間だけを表しています。Self列でのソートは先ほどのボトムアップ式の表示では便利ですが、トップダウン表示の場合は「Total」列をクリックして「呼び出し先の関数の実行時間を含めた時間」でソートすると見やすくなります。

 ここではfibという関数が再帰的に呼ばれ、全体のほとんどの時間がその処理にかかっていることがわかります。ボトルネックがfib関数であることが確認できたので、fib関数を重点的に改善すればプログラムの大幅な高速化が見込めそうだということがわかります。

node-inspectorの導入

 node-inspector(BSDライセンス)をインストールするには、以下のコマンドを実行します。

$ npm install -g node-inspector

まとめ

 以上、Node.jsでアプリケーションを作る上で指針となる開発手法をかいつまんで解説しました。次回からはブラウザで動くJavaScript開発のベストプラクティス編をお送りします。お楽しみに!

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
CoffeeScriptによるモダンなWebアプリケーション開発連載記事一覧

もっと読む

この記事の著者

飯塚 直(イイヅカ ナオ)

1984年東京都生まれ。 高校時代に趣味でPerlやJavaを使ってプログラミングを始める。 慶応大学湘南藤沢キャンパス卒業後、共同通信社にてニュースサイトの開発などを担当。 その後、面白法人カヤックにてソーシャルゲームの開発などを手がける。 2012年現在、カヤックを退社し個人として活動し...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/6530 2012/05/07 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング