blog

日常・技術のことを記録する

Node.jsでプロファイルツールを使ってみる(--prof)

処理に時間がかかっている様子やどれ位メモリを使っているのかを調べる方法をプロファイルというらしい。

Node.js に組み込まれたプロファイルツール

node --prof (対象のプログラム).js

で、カレントに「isolate-0x424a810-v8.log」みたいなログファイルができる。
ここにプロファイルが載ってるんだけど、そのままみると

$ head -50 isolate-0x424a810-v8.log
v8-version,6,8,275,32,-node.45,0
shared-library,/home/vagrant/.nvm/versions/node/v10.14.2/bin/node,0x400000,0x2290000,0
shared-library,/lib/x86_64-linux-gnu/libc-2.27.so,0x7fad972e9000,0x7fad974d0000,0
shared-library,/lib/x86_64-linux-gnu/libpthread-2.27.so,0x7fad976da000,0x7fad976f4000,0
shared-library,/lib/x86_64-linux-gnu/libgcc_s.so.1,0x7fad978f9000,0x7fad97910000,0
.........

こんな感じでわけわからないから、nodeコマンドでわかりやすく表示する。

$ node --prof-process isolate-0x424a810-v8.log
Statistical profiling result from isolate-0x424a810-v8.log, (3359 ticks, 172 unaccounted, 0 excluded).

 [Shared libraries]:
   ticks  total  nonlib   name
    198    5.9%          /lib/x86_64-linux-gnu/libc-2.27.so
     72    2.1%          /home/vagrant/.nvm/versions/node/v10.14.2/bin/node
     25    0.7%          /lib/x86_64-linux-gnu/libpthread-2.27.so
      1    0.0%          /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.25

 [JavaScript]:
   ticks  total  nonlib   name
   2885   85.9%   94.2%  LazyCompile: *fib /home/vagrant/workspace/fibonacci/app.js:2:13
      1    0.0%    0.0%  LazyCompile: ~nextTick internal/process/next_tick.js:96:20
      1    0.0%    0.0%  LazyCompile: ~log console.js:196:37
      1    0.0%    0.0%  Builtin: LoadIC_Uninitialized
      1    0.0%    0.0%  Builtin: KeyedLoadIC_PolymorphicName
      1    0.0%    0.0%  Builtin: InterpreterEntryTrampoline
      1    0.0%    0.0%  Builtin: FastNewClosure

 [C++]:
   ticks  total  nonlib   name

 [Summary]:
   ticks  total  nonlib   name
   2891   86.1%   94.4%  JavaScript
      0    0.0%    0.0%  C++
      3    0.1%    0.1%  GC
    296    8.8%          Shared libraries
    172    5.1%          Unaccounted

 [C++ entry points]:
   ticks    cpp   total   name

 [Bottom up (heavy) profile]:
  Note: percentage shows a share of a particular caller in the total
  amount of its parent calls.
  Callers occupying less than 1.0% are not shown.

   ticks parent  name
   2885   85.9%  LazyCompile: *fib /home/vagrant/workspace/fibonacci/app.js:2:13
....................(以下プロファイル)

[Summary] という項目に、 プログラムの処理全体の概要、
[Bottom up (heavy) profile] という項目に、時間のかかった処理(一番左の ticks という列は、各処理にかかった イベントループ数)
などなど。
アルゴリズムの改善とかで、どの処理に時間かかったかを調べるときに便利ね!