ハカセノオト

moon indicating dark mode
sun indicating light mode

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

サンプルにおける出力結果の図は下記のようになります。

profile result

各処理での処理時間が記載されています。 無名関数を使うと、(anonymous) にまとめられてしまうので、解析のことを考えるとコード上の関数は名前付きにしておいた方がわかりやすいですね。

まとめ

解説は以上となります。

手元で試されたい場合は、以下のページのコードを参考にしてください。

https://github.com/hnishi/hello-pprof-nodejs/tree/master


hnishi

hnishi のブログ

ソフトウェアエンジニアです。
誰かの役に立つかもしれないと思って、調べたこと、勉強したこと、躓いた箇所などを記事にしています。
問い合わせはこちらからお願いします。