neovim luaのパフォーマンス計測方法
方法1
最初は下の方法2を使用していましたが、profile.nvimという素晴らしいプラグインが出ていたので今はこれを使用するのがおすすめです。
使い方はプラグインのREADMEに書いてある通りなのですがそれだけでもなんなので自分の使用例を書いておきます。
こちらが自分のprofile.nvim
の設定です。
ポイントとしては、パッケージマネージャ(自分の場合はlazy.nvim
)がこのプラグインを読み込む前のコードや
パッケージマネージャ自体のパフォーマンスを計測したい場合には自身でこのプラグインを使用しなければならないということです。
この設定ではvim.fn.stdpath "config" .. "/profile.nvim"
をruntimepath
に追加して、lazyのsetup前からプラグインを使用できるようにしています。
これで
NVIM_PROFILE=start nvim
のようにneovimを起動し、<F1>
キーを押すことでプロファイルのデータを保存できます。
データの見方
データを見るには、https://ui.perfetto.devを使用します。試しに自分の設定で取ったプロファイルが以下のようになります。
これでどのコードに時間がかかっているのか一目瞭然です。neovimの起動時間を詰めたいときなどに非常に有用な他、
--startuptime
とは違い好きなタイミングでプロファイルを行えるため、プラグイン作成にも使えるんじゃないかなと思います。
方法2
plenary.nvim がインストールしてあれば使いかたは簡単で、計測したい範囲を
require'plenary.profile'.start("profile.log")
-- code to be profiled
require'plenary.profile'.stop()
のように囲むだけです。
これで init.lua であれば~/.config/nvim
以下に profile.log ができます。
グラフにする
が、このログは超絶見づらいので図にしたいです。そこでinfernoという
Rust 製ツールを使います。README
にごちゃごちゃ書いてますが今回はログをグラフに変換したいだけなので cargo install
するだけです。もちろん Rust
ツールチェーンがインストールされている必要があります。
cargo install inferno
そしてさっきのプロファイルの開始の行を
require'plenary.profile'.start("profile.log", {flame = true})
に変えます。 そして
inferno-flamegraph profile.log > flame.svg
を実行すると svg で図が出力されます。
試しに自分の init.lua で試してみたのがこちらです。
どのプラグインに時間がかかっているのかが一目瞭然です。設定だけではなくプラグイン開発にも役立ちそうですね。
jit.vmdef not found
とかいうエラーがでた
LuaJIT をインストールします。
git clone https://github.com/LuaJIT/LuaJIT
cd LuaJIT
make
そして環境変数LUA_PATH
に今インストールしたLuaJITのパス/src
を追加します。
これで動くはずです。
この記事は https://note.nazo6.dev/blog/410be6ec751f9e とのクロスポストです。
Discussion