📈

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

2021/09/05に公開

方法1

最初は下の方法2を使用していましたが、profile.nvimという素晴らしいプラグインが出ていたので今はこれを使用するのがおすすめです。

使い方はプラグインのREADMEに書いてある通りなのですがそれだけでもなんなので自分の使用例を書いておきます。

https://github.com/nazo6/nvim/blob/c6dff3f61c62602c6e3cc98cf691d965b24e72c3/lua/user/profile.lua

こちらが自分の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 の profilerを使います

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 とのクロスポストです。

GitHubで編集を提案

Discussion