Open6

なぜBunは速いのか

kenmorikenmori

「なぜBunは速いのか」背景

最近私はnpmからpnpmへの移行を進めていた
移行自体は簡単だったが、パッケージマネージャが変わるので他開発者の同意を得ないといけない
pnpmはすでに多くの現場で使われていて、且つnpmと互換性があるので同意を得るのは難しくなかった

私がPRをあげたその日に
Bun v1.0のリリースがアナウンスされた。(比較表を見てしまった)
私は今度はBunを導入したいと思い、提案した

他開発者もBunの魅力にすぐに気づきpnpmをやめてそれにするべきか議論が起こった
が、
開発者の中にWindowsで開発しているデザインエンジニアがいることと大きなリリースを控えていることが理由で一旦pnpmがマージされた

Bunはなぜ速いのか、私はここに焦点を当てて調べまとめることにした

kenmorikenmori

Zig言語

BunとNode.jsの比較

Bunは、Zigプログラミング言語を使用してスクラッチから構築されたJavaScriptランタイムであり、高速起動、効率的なコード実行、まとまりのある開発者エクスペリエンスに重点を置いている。JavaScriptアプリケーションの開発を最適化・効率化するためのツールや機能を提供し、既存のJavaScriptエコシステムと互換性を持つように設計されています。

記事はBunはなぜ速いのか、Node.jsとの違いがまとめらている

  • 新しい言語Zigが使われていてメモリ最適化がされているという
    • Rustで書かれたものがより速いのでは...?
      • 言語とコンパイラのベンチマーク比較するサイトがあった
        • ZigとRustではどちらが速いとは言い難いぐらいの差でしかないとのこと(ref)
      • コンパイル時に違いがあるという (Zig vs Rust)
        • Compilation and Run-time Efficiency
          Both Zig and Rust are based on LLVM, providing low-level control for users. Consequently, their best-case run-time efficiency is almost identical. The key difference arises during the compilation process. Due to its lower count of high-level expressions and less stringent safety assurances, Zig’s processor can compile code faster than Rust. Benchmarks using simple programming tasks indicate comparable compilation times between the two languages.

        • コンパイルとランタイムの効率化
          ZigもRustもLLVMをベースにしており、ユーザーに低レベルの制御を提供している。その結果、ベストケースのランタイム効率はほぼ同じだ。重要な違いは、コンパイル時に生じる。Zigのプロセッサは、高水準式の数が少なく、安全性の保証がそれほど厳しくないため、Rustよりも高速にコードをコンパイルできる。単純なプログラミング・タスクを用いたベンチマークでは、両言語のコンパイル時間は同等である。

kenmorikenmori

JavaScriptCore

BunはJavaScriptCore(JSC)上で構築されている(Node.jsやDenoで使われているのはV8)

  • V8との違いは?
    • V8はC++で書かれている
    • WHAT EXACTLY ARE THE DIFFERENCES BETWEEN JSC AND V8?
      • JSCは開始時間の速さを優先し、V8は実行の速さを優先する
      • JSCには3つの最適化コンパイラがある、V8には2つの最適化コンパイラがある
      • JSCのアーキテクチャーは使用するメモリが少ない。V8はより多くのランタイム最適化を行うが、その分メモリを消費する
  • なぜnodejsのようにv8ではなくJSCを使うのか? issue in nuxtjs
    • BunでJavaScriptCoreを使用するメリットは
      • JITコンパイル:ジャストインタイム(JIT)コンパイルは、JavaScriptコードを実行時にマシンコードにコンパイルする技術。これにより、特に頻繁に実行されるコードの実行が速くなります(V8も同様)
        -> JITの詳しい説明

      • 関数のインライン化:関数のインライン化とは、関数の呼び出しを実際のコードに置き換える技術である。これにより、関数を呼び出すオーバーヘッドがなくなるため、コードの実行速度が速くなる。

      • デッドコード除去:デッドコード除去とは、実行されることのないコードを除去する技術である。これにより、コードがより小さく、より速くなる。

      • 移植性:JavaScriptCoreはクロスプラットフォームエンジンなので、Bunはさまざまなオペレーティングシステムで使用できます。

    • JSCは特定のコンテキストをロックする(コンテキストは仮想マシンの一部)。V8はコード実行中に仮想マシン全体をロックする
      • 起動時間を短縮するために最適化されている
  • ネイティブツールとして提供しているため外部ライブラリへの依存をなくす設計がされている
    • TypeScriptのネイティブサポート(トランスパイルするツールが不要等)

An introduction Bun, the evolution of Node.js

kenmorikenmori

Performanceに関するpost

その理由を言うと、みんながっかりするんだ。"Bunは速い "というのは、プロファイリングに多くの時間を費やし、速くしようとしているからだ。人々は「Zigが速い」とか「engineが速い」といった答えを好む。