pprof-nodejs で TypeScript/JavaScript コードのパフォーマンスを解析する
August 19, 2023
pprof は、Google によって開発されているプロファイリングデータの視覚化と分析のためのツールです。pprof-nodejs は 、Node.js 向けの pprof でプロファイルするためのパッケージです。
本記事では、pprof-nodejs によるプロファイリングの実行方法を解説します。
なお、利用するサンプルコードは、以下のページに公開しています。
https://github.com/hnishi/hello-pprof-nodejs/tree/master
プロファイリング実行方法
解析したい処理の直前に以下の処理を挿入します。
const profilePromise = pprof.time.profile({durationMillis: 1000, // time in milliseconds for which to collect profile.});
durationMillis
にプロファイリングデータを収集する時間を指定します。処理時間に応じて、適宜調整が必要です。
解析したい処理の直後に以下の処理を挿入します。
const profile = await profilePromise;const buf = await pprof.encode(profile);fs.writeFile("wall.pb.gz", buf, (err) => {if (err) throw err;});
"wall.pb.gz"
が出力されるプロファイルデータのファイル名です。
今回のサンプルでは、テストコード上の処理に対してプロファイリングを行っています。
したがって、以下のようにテスト実行後に、コマンドを実行したディレクトリに、"wall.pb.gz"
が出力されます。
npm test
"wall.pb.gz"
ファイルは、後で pprof による解析や可視化のために読み込むことができます。
解析結果の確認
pprof は、Go 製の CLI tool になっているため、別途インストールの必要があります。
インストール後、下記のようにコマンドを実行することで、ブラウザ上でプロファイリングデータを可視化できます。
pprof -http=: wall.pb.gz
サンプルにおける出力結果の図は下記のようになります。
各処理での処理時間が記載されています。
無名関数を使うと、(anonymous)
にまとめられてしまうので、解析のことを考えるとコード上の関数は名前付きにしておいた方がわかりやすいですね。
まとめ
解説は以上となります。
手元で試されたい場合は、以下のページのコードを参考にしてください。