NodeJsの新たなる対抗馬、BunJsを試してみた。
はじめに
初めましてねこてっくです、よろしくおねがいします。
記事を書くに至った経緯は、ただ自分の知的好奇心を満たすだけではなく、エビデンスとして残していこうと思ったからです。
こういったものを書くのは始めてなので不備不足とかは気付き次第直していきます。
ご指摘等ございましたら、コメントいただけると幸いです。
1. BunJsとは
インターネットを徘徊していて、たまたま見かけて興味を惹かれました。
現在はサーバーサイドJavascriptエンジンとして覇権を握っていますが、それよりも高速に動作するものとして生まれたようです。
なんとNodeJsより3倍近く速いとのこと。
これは試してみるしかないですね。
1.1. 公式によるBun/Node/Denoの性能比較イメージ
Reactのレンダリングテスト | sqliteのテーブルロードテスト | ffiのハッシュ計算テスト |
---|---|---|
1.2. 公式サイト
2. 早速試してみる
2.1. 前提
私の実行環境は以下の通りとなります。
- Raspberry Pi4(Mem2GB)
- Debian GNU/Linux 11 (bullseye)
- Node(ホストマシンにインストール済み)
- v17.5.0
- Bun
- 0.1.11[1]
- Node(ホストマシンにインストール済み)
- Debian GNU/Linux 11 (bullseye)
2.2. 前段作業
2.2.1. 実行用コンテナの準備
お試しですので環境を汚さないようにBunを動かすのはDockerコンテナを使います。
debian:bullseye-slimイメージを使用し、サクッと作ります。
docker run -it --name bun-test debian:bullseye-slim
コンテナを残したくない方は以下でも良いですね。
docker run -it --rm debian:bullseye-slim
2.2.2. 必要なパッケージのインストール
curlとunzipは必須、nanoはエディタなので任意となります。
apt update && apt install -y curl unzip nano
2.2.3. Bunのインストール
公式サイトに記載のある通りやってみます。
curl https://bun.sh/install | bash
上記を実行すると、インストールスクリプトが実行され、下記のように出力されたら完了です。[2]
bun was installed successfully to ~/.bun/bin/bun
Manually add the directory to ~/.bashrc (or similar):
export BUN_INSTALL="$HOME/.bun"
export PATH="$BUN_INSTALL/bin:$PATH"
使う前に手動でPATHを通してくださいねって事ですね。
と、いうわけでPATHを通します。
cat << EOF >> .bashrc
export BUN_INSTALL="$HOME/.bun"
export PATH="$BUN_INSTALL/bin:$PATH"
EOF
source .bashrc
(別案でシンボルリンクを置くのもありかもと思います。)
ln -s $HOME/.bun/bin/bun /usr/local/bin/bun
2.3. 実行と検証
2.3.1. バージョンの確認
# bun -v
0.1.11
ちゃんとバージョンの確認が出来ました。
2.3.2. 実行速度の確認
ここでは適当に時間のかかる処理を行わせてみます。
以下にスクリプトをおいておきます。
cat << EOF >> fib.js
const fib = (n) => {
if (n < 2) { return n; }
return fib(n - 1) + fib(n - 2);
};
console.log(fib(43));
EOF
なんてことのないフィボナッチ数列の計算を行わせるだけです。
2.3.2.1. Bunで実行時間計測
# time bun fib.js
433494437
real 0m13.382s
user 0m13.360s
sys 0m0.029s
13秒ほどで終わりました。
これが速いのか否か、ホスト側にはNodeでも、同じものを実行してみます。
2.3.2.2. Nodeで実行時間計測
# time node fib.js
433494437
real 0m22.052s
user 0m21.445s
sys 0m0.032s
22秒ほどで終わりました。
3倍とは行かないにしても、NodeよりもBunの方が高速なのは本当のようです。
2.4. 検証を終えて
あくまでRaspberry Pi4のスペックでの検証結果になるので、より高速なCPUを搭載したPCで行えば、もっと違いがはっきりするかもしれません。
それでも速い事には違いないので凄いですね。
3. Bunの凄いところ
公式ドキュメントの全てを読んだわけではないのですが、実は処理が速いだけではなく既存のnpmパッケージがほぼそのまま動かせたり、JSXやTypeScriptなどがそのまま動かせたりもするようです。
英語は苦手ですが、頑張ってドキュメントを読み進めてみたいと思います。
最後に
拙い文章であったと思いますが、ここまで読んで頂いてありがとうございます。
今回の検証にあたり、作成したDockerイメージをDockerHubにPushしておきました。
インストール作業をすっ飛ばしてお試ししたい方は、Pullしてみてください。
Raspberry Pi4で作成したので、OS/ARCHはlinux/arm64/v8
になっています。
伸びていたら調査や更新などのやる気に繋がるかと思います。[3]
おまけ
Bunのインストール先を変更する方法
インストールスクリプトをチラ見したところ、インストール前に環境変数BUN_INSTALLをセットする事で任意の場所にインストールできるようです。
ただし、変更は自己責任でおねがいします。
インストール先を[/usr/local/lib/bun]に変更する場合
BUN_INSTALL=/usr/local/lib/bun
Discussion