nazo6 noteblog

neovim luaのパフォーマンス計測方法

作成:2021/09/04

更新:2023/04/28

この記事は、Zennにも投稿しています。

方法1

最初は下の方法2を使用していましたが、profile.nvimという素晴らしいプラグインが出ていたので今はこれを使用するのがおすすめです。
使い方はプラグインのREADMEに書いてある通りなのですがそれだけでもなんなので自分の使用例を書いておきます。

nvim/lua/user/profile.lua at c6dff3f61c62602c6e3cc98cf691d965b24e72c3 · nazo6/nvim

Contribute to nazo6/nvim development by creating an account on GitHub.

github.com

こちらが自分のprofile.nvimの設定です。
ポイントとしては、パッケージマネージャ(自分の場合はlazy.nvim)がこのプラグインを読み込む前のコードや
パッケージマネージャ自体のパフォーマンスを計測したい場合には自身でこのプラグインを使用しなければならないということです。
この設定ではvim.fn.stdpath "config" .. "/profile.nvim"runtimepathに追加して、lazyのsetup前からプラグインを使用できるようにしています。
これで
NVIM_PROFILE=start nvim
のようにneovimを起動し、<F1>キーを押すことでプロファイルのデータを保存できます。

データの見方

データを見るには、https://ui.perfetto.devを使用します。試しに自分の設定で取ったプロファイルが以下のようになります。
../../../../resource/public/blog/2021/09/neovim-profile/graph.png

これでどのコードに時間がかかっているのか一目瞭然です。neovimの起動時間を詰めたいときなどに非常に有用な他、
--startuptimeとは違い好きなタイミングでプロファイルを行えるため、プラグイン作成にも使えるんじゃないかなと思います。

方法2

こっちは方法1を発見する前の内容です。現在でも使えますが方法1のほうが正確な気がします。
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 で試してみたのがこちらです。
https://storage.googleapis.com/zenn-user-upload/e23fe12b0c1c5f5cdfa01fdb.png

どのプラグインに時間がかかっているのかが一目瞭然です。設定だけではなくプラグイン開発にも役立ちそうですね。

jit.vmdef not found とかいうエラーがでた

LuaJIT をインストールします。
git clone https://github.com/LuaJIT/LuaJIT
cd LuaJIT
make
そして環境変数LUA_PATH今インストールしたLuaJITのパス/srcを追加します。
これで動くはずです。