Yarn PnP のモジュール読み込み速度
- カテゴリ:
- JavaScript
- コメント数:
- Comments: 0
◆ インストールは速くても zip を毎回展開するのでロードは遅そう
◆ 試してみたらやっぱり遅い
◆ node コマンドも yarn 経由になるので全体としてはけっこう差がある
◆ ネットワーク越しのストレージだと zip でまとめてダウンロードできるので逆に速くなった
◆ 試してみたらやっぱり遅い
◆ node コマンドも yarn 経由になるので全体としてはけっこう差がある
◆ ネットワーク越しのストレージだと zip でまとめてダウンロードできるので逆に速くなった
Yarn4 が出ましたし そろそろ PnP をメインに使い始めたほうがいいのかなと考えてます (Yarn3 の頃にも言ってたような?)
でも node_modules がなくなるので 直接パッケージのソースコードを確認できなくなるのが不便なんですよね
普段からけっこう node_modules の中を見てるので
それと PnP は インストールは速くなっても require や import は遅くなると思います
PnP を使うとモジュールをロードするときに都度 zip から展開することになります
node_modules では不要な処理なので PnP のほうが遅くなるはずです
開発中は再起動を繰り返すことがあるので起動が遅くなるのは不満があります
今でも起動が遅いなと思うことがあるくらいですし 読み込み速度は結構重要です
どれくらい差があるのか調べてみました
express と koa と hapi と fastify です
合わせて node_modules フォルダのサイズ的はおよそ 15MB でした
計測する内容はこれです
結果ですが PnP を使ったものはこうなりました
0.5 秒ほどです
node_modules だとこうなりました
0.3 秒ほどです
2 倍とまで行きませんが結構差があります
考えてみると PnP だと独自のローダーを使うので node コマンドを直接使えません
yarn node というふうに yarn を通します
これのせいで node コマンドの起動自体にかかる時間が増えてるように思います
time コマンドを通してコマンド全体の実行速度を計測してみました
倍以上に時間差があります
やっぱり PnP は遅いです
個別に小さいファイルを大量に読み取るのは時間がかかりますが zip にまとまっていればパッケージごとに 1 ファイルで済ませられます
試してみました
WSL から Windows のファイルシステムにおいたプロジェクトを読み取ります
まずは PnP です
3 秒弱でさっきよりもかなり遅くなっています
次に node_modules です
7 秒弱です
さらに遅いです
こういうときは PnP にしたほうが良さそうですね
私の場合 Linux で Node.js を動かすときって基本 Windows のファイルシステムを共有して外部の Linux 環境や WSL からファイルを読み込んでるので PnP を積極的に使っていい気がしました
node_modules がないので実際のコードがすぐ見れないのだけが気がかりですけど
yarn を通しても 「yarn node --inspect」 でデバッガーを接続して実行中のコードは見れますが これだけじゃなくて node_modules を直接見たいことが結構あるのですよね
でも node_modules がなくなるので 直接パッケージのソースコードを確認できなくなるのが不便なんですよね
普段からけっこう node_modules の中を見てるので
それと PnP は インストールは速くなっても require や import は遅くなると思います
PnP を使うとモジュールをロードするときに都度 zip から展開することになります
node_modules では不要な処理なので PnP のほうが遅くなるはずです
開発中は再起動を繰り返すことがあるので起動が遅くなるのは不満があります
今でも起動が遅いなと思うことがあるくらいですし 読み込み速度は結構重要です
どれくらい差があるのか調べてみました
ロード時間の比較
重そうなパッケージがパッと思い浮かばなかったので サーバーサイドのフレームワークのパッケージをいくつか入れてすべてロードすることにしましたexpress と koa と hapi と fastify です
合わせて node_modules フォルダのサイズ的はおよそ 15MB でした
計測する内容はこれです
console.time()
require("express")
require("koa")
require("hapi")
require("fastify")
console.timeEnd()
結果ですが PnP を使ったものはこうなりました
default: 498.091ms
default: 486.451ms
default: 487.522ms
default: 500.911ms
default: 489.471ms
default: 493.81ms
default: 489.068ms
default: 486.64ms
default: 491.693ms
default: 499.129ms
0.5 秒ほどです
node_modules だとこうなりました
default: 301.83ms
default: 274.523ms
default: 282.952ms
default: 278.844ms
default: 277.118ms
default: 279.432ms
default: 286.744ms
default: 276.592ms
default: 282.868ms
default: 278.434ms
0.3 秒ほどです
2 倍とまで行きませんが結構差があります
実際のコマンドの時間
ただ 体感だともっと差がありました考えてみると PnP だと独自のローダーを使うので node コマンドを直接使えません
yarn node というふうに yarn を通します
これのせいで node コマンドの起動自体にかかる時間が増えてるように思います
time コマンドを通してコマンド全体の実行速度を計測してみました
PnP:
real 0m1.084s
user 0m1.349s
sys 0m0.106s
node_modules:
real 0m0.343s
user 0m0.391s
sys 0m0.029s
倍以上に時間差があります
やっぱり PnP は遅いです
速い場合
ふと思ったのですが zip 単位での読み取りなので WSL から Windows のファイルシステムにアクセスしたり cifs マウントしてるストレージを使ったりしてる場合は速くなりそうです個別に小さいファイルを大量に読み取るのは時間がかかりますが zip にまとまっていればパッケージごとに 1 ファイルで済ませられます
試してみました
WSL から Windows のファイルシステムにおいたプロジェクトを読み取ります
まずは PnP です
root@cb87b95ff33a:/mnt/3# time yarn node index.js
default: 2.169s
real 0m2.872s
user 0m1.740s
sys 0m0.173s
root@cb87b95ff33a:/mnt/3# time yarn node index.js
default: 2.161s
real 0m2.935s
user 0m1.714s
sys 0m0.284s
root@cb87b95ff33a:/mnt/3# time yarn node index.js
default: 2.214s
real 0m2.923s
user 0m1.673s
sys 0m0.279s
3 秒弱でさっきよりもかなり遅くなっています
次に node_modules です
root@cb87b95ff33a:/mnt/3# time node index.js
default: 6.839s
real 0m6.911s
user 0m1.025s
sys 0m1.003s
root@cb87b95ff33a:/mnt/3# time node index.js
default: 6.774s
real 0m6.854s
user 0m1.093s
sys 0m0.856s
root@cb87b95ff33a:/mnt/3# time node index.js
default: 6.825s
real 0m6.897s
user 0m1.227s
sys 0m0.781s
7 秒弱です
さらに遅いです
こういうときは PnP にしたほうが良さそうですね
私の場合 Linux で Node.js を動かすときって基本 Windows のファイルシステムを共有して外部の Linux 環境や WSL からファイルを読み込んでるので PnP を積極的に使っていい気がしました
node_modules がないので実際のコードがすぐ見れないのだけが気がかりですけど
yarn を通しても 「yarn node --inspect」 でデバッガーを接続して実行中のコードは見れますが これだけじゃなくて node_modules を直接見たいことが結構あるのですよね