💡

NodeJsの新たなる対抗馬、BunJsを試してみた。

2022/09/19に公開

はじめに

初めましてねこてっくです、よろしくおねがいします。
記事を書くに至った経緯は、ただ自分の知的好奇心を満たすだけではなく、エビデンスとして残していこうと思ったからです。
こういったものを書くのは始めてなので不備不足とかは気付き次第直していきます。
ご指摘等ございましたら、コメントいただけると幸いです。

1. BunJsとは

インターネットを徘徊していて、たまたま見かけて興味を惹かれました。
現在はサーバーサイドJavascriptエンジンとして覇権を握っていますが、それよりも高速に動作するものとして生まれたようです。
なんとNodeJsより3倍近く速いとのこと。
これは試してみるしかないですね。

1.1. 公式によるBun/Node/Denoの性能比較イメージ

Reactのレンダリングテスト sqliteのテーブルロードテスト ffiのハッシュ計算テスト
Reactのレンダリングテスト sqliteのテーブルロードテスト ffiのハッシュ計算テスト

1.2. 公式サイト

Bun
https://bun.sh/

2. 早速試してみる

2.1. 前提

私の実行環境は以下の通りとなります。

  • Raspberry Pi4(Mem2GB)
    • Debian GNU/Linux 11 (bullseye)
      • Node(ホストマシンにインストール済み)
        • v17.5.0
      • Bun

2.2. 前段作業

2.2.1. 実行用コンテナの準備

お試しですので環境を汚さないようにBunを動かすのはDockerコンテナを使います。
debian:bullseye-slimイメージを使用し、サクッと作ります。

host bash
docker run -it --name bun-test debian:bullseye-slim

コンテナを残したくない方は以下でも良いですね。

host bash
docker run -it --rm debian:bullseye-slim

2.2.2. 必要なパッケージのインストール

curlunzipは必須、nanoはエディタなので任意となります。

container console
apt update && apt install -y curl unzip nano

2.2.3. Bunのインストール

公式サイトに記載のある通りやってみます。

container bash
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を通します。

container bash
cat << EOF >> .bashrc
export BUN_INSTALL="$HOME/.bun"
export PATH="$BUN_INSTALL/bin:$PATH"
EOF

source .bashrc

(別案でシンボルリンクを置くのもありかもと思います。)

container bash
ln -s $HOME/.bun/bin/bun /usr/local/bin/bun

2.3. 実行と検証

2.3.1. バージョンの確認

container bash
# bun -v
0.1.11

ちゃんとバージョンの確認が出来ました。

2.3.2. 実行速度の確認

ここでは適当に時間のかかる処理を行わせてみます。
以下にスクリプトをおいておきます。

container bash
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で実行時間計測

container bash
# time bun fib.js
433494437

real    0m13.382s
user    0m13.360s
sys     0m0.029s

13秒ほどで終わりました。
これが速いのか否か、ホスト側にはNodeでも、同じものを実行してみます。

2.3.2.2. Nodeで実行時間計測

container bash
# 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]

https://hub.docker.com/r/neko3tech/bun

おまけ

Bunのインストール先を変更する方法

インストールスクリプトをチラ見したところ、インストール前に環境変数BUN_INSTALLをセットする事で任意の場所にインストールできるようです。
ただし、変更は自己責任でおねがいします。

インストール先を[/usr/local/lib/bun]に変更する場合

bash
BUN_INSTALL=/usr/local/lib/bun
脚注
  1. 検証を行った2022/09/17時点のものです。 ↩︎

  2. 一応インストール先の変更方法もあるようです。 ↩︎

  3. Githubもちゃんと使ったことがないので、あわせて使えるようになりたいと思ってます。 ↩︎

Discussion