Luna Benchmark Report

Luna vs React vs Preact の比較ベンチマーク結果。

TL;DR - Luna の強み

指標Luna備考
バンドルサイズ9.4 KB (gzip)React の 1/6
SSR 性能12,800 pages/sec1000アイテムリスト
Signal 更新11M ops/secFine-Grained Reactivity
部分更新4.5M ops/secDOM 操作なしで更新

Bundle Size Comparison

LibraryMinifiedGzipvs React
React 19 + ReactDOM193 KB60 KB-
Luna33 KB9.4 KB6x smaller
Preact 10 + hooks13 KB5.4 KB15x smaller

Luna は React の 1/6 のサイズ。Preact より大きいが、Signal, SSR, Island Architecture を含むフルスタックフレームワーク。

Runtime Performance

jsdom 環境でのベンチマーク結果 (vitest bench)。

Initial Mount (2,500 cells)

Libraryops/secvs Preact
Preact9811x
React1238x slower
Luna6714.6x slower

Reactive State Mount (2,500 cells)

Libraryops/secvs Preact
Preact611x
React421.4x slower
Luna421.5x slower

State Update (2,500 cells)

Libraryops/secvs Preact
Preact12,5231x
React119105x slower
Luna111113x slower

Note: Preact の Update が極端に速いのは、状態変更のバッチ処理による可能性あり。

Large Grid (5,000 cells)

Libraryops/secvs Preact
Preact3871x
React537.3x slower
Luna2913.3x slower

List Operations (Add 100 items)

Libraryops/secvs Preact
Preact2,8761x
React6544x slower
Luna7240x slower

Analysis

Current Status

Luna は現時点で速度面では React/Preact に劣っています。これは以下の要因による:

  1. MoonBit → JS コンパイル: 生成された JS コードは手書きより最適化の余地がある

  2. Fine-Grained Reactivity のオーバーヘッド: 各要素ごとの依存追跡コスト

  3. 開発初期段階: まだ最適化が進んでいない

Luna の価値提案

速度だけが全てではありません。Luna は以下の価値を提供します:

FeatureLunaReactPreact
Island Architecture✅ Built-in
Fine-Grained Reactivity❌ (VDOM)❌ (VDOM)
SSR✅ NativeRequires Next.js etc.✅ preact-render-to-string
Hydration Strategies✅ load/idle/visible/media
Type Safety✅ MoonBitTypeScriptTypeScript
Multi-target✅ js/native/wasmJS onlyJS only

Future Optimization Opportunities

  1. wasm-gc target: MoonBit は wasm-gc にコンパイル可能。将来的に JS より高速になる可能性

  2. コンパイラ最適化: MoonBit コンパイラの改善による自動的な高速化

  3. DOM 操作の最適化: 現在の実装にはまだ改善の余地がある

Benchmark Environment

  • Node.js v24 + jsdom

  • Vitest 4.0.15

  • macOS Darwin 24.5.0

Running Benchmarks

cd luna.mbt
npx vitest bench js/luna/benches/grid.bench.ts --run

Luna の強み - MoonBit ベンチマーク

Luna 内部の MoonBit ベンチマーク結果。これらは Luna の設計上の強みを示しています。

SSR (Server-Side Rendering)

テスト時間ops/sec
Simple element0.13 µs7.7M
10 item list0.83 µs1.2M
100 item list8.12 µs123K
1000 item list78 µs12.8K
10 card page5.95 µs168K
50 card page28.5 µs35K
100 card page58.4 µs17K

SSR 性能は非常に高速 - 1000要素のリストを 78µs で生成可能。

Signal (Fine-Grained Reactivity)

操作時間ops/sec
Signal::new~0.36 µs/100280K
Signal::get0.28 µs/10003.6M
Signal::set0.09 µs11M
Memo cached read0.28 µs/10003.6M
Memo recompute0.63 µs1.6M
Effect rerun~1 µs1M
Batch 100 updates5 µs200K

Signal 更新は 11M ops/sec - React の setState より桁違いに高速。

DOM 更新 (Fine-Grained)

操作時間ops/sec
Text update0.22 µs4.5M
Attr update0.39 µs2.6M
Show toggle2.56 µs390K
Deep update (5 levels)0.37 µs2.7M

部分更新は 4.5M ops/sec - VDOM diff なしで直接 DOM 更新。

なぜ Luna は VDOM ベンチで遅いのか

Grid ベンチマーク(2,500セル全更新)では Luna は Preact より遅いが、これは:

  1. 全要素更新は Luna の想定外ユースケース

    • Fine-Grained Reactivity は「一部だけ更新」が前提

    • 2,500セル全部を毎回更新するのは VDOM 向き

  2. Luna の設計思想

    • 変更された Signal だけが DOM を更新

    • 1セルの更新 = 0.22µs(VDOM diff 不要)

  3. 実際のアプリでは Luna が有利なケース

    • ほとんどの UI は部分更新

    • Island Architecture で初期化コストを分散

Conclusion

Luna が向いているケース

  • SSR + 選択的ハイドレーション が必要

  • Island Architecture で部分ハイドレーションしたい

  • 部分更新が多い UI(リアクティブなダッシュボード等)

  • 小さなバンドルサイズ が重要(React の 1/6)

  • ✅ MoonBit で型安全な UI を書きたい

  • ✅ 将来的な wasm-gc 対応を見据えている

Luna が向いていないケース

  • 大量要素の全更新(ゲームのフレーム更新等)

  • ❌ React/Preact エコシステム(既存ライブラリ)が必要

比較まとめ

特性LunaPreactReact
バンドルサイズ⭐⭐⭐ 9KB⭐⭐⭐⭐ 5KB⭐ 60KB
全要素更新⭐⭐⭐⭐⭐⭐
部分更新⭐⭐⭐⭐⭐⭐⭐⭐
SSR⭐⭐⭐⭐⭐⭐⭐⭐
Island Architecture⭐⭐⭐⭐ Built-in