Slide 1

Slide 1 text

Web Framework Benchmark Battle 2026, Any% @a_matsuda, at Kaigi on Rails 2026 1 / 175

Slide 2

Slide 2 text

me ! Kaminariってやつをやってます 2 / 175

Slide 3

Slide 3 text

Kaminari !!! 3 / 175

Slide 4

Slide 4 text

Kaminari https://github.com/kaminari/kaminari/ 4 / 175

Slide 5

Slide 5 text

Kaminari ! Kaigi on Rails 2026記念リリース(?) 5 / 175

Slide 6

Slide 6 text

me ! RubyKaigiってやつをやってます 6 / 175

Slide 7

Slide 7 text

RubyKaigi ! 来年は宮崎" ! うまいものが⾷えそう! 7 / 175

Slide 8

Slide 8 text

me ! Asakusa.rbってやつをやってます 8 / 175

Slide 9

Slide 9 text

⼤江⼾RubyKaigi 11 ってやつをやります! ! 2026/11/8(⽇) ! 北千住「天空劇場」 9 / 175

Slide 10

Slide 10 text

me ! Rubyのコミッターってやつをやってます ! Ruby on Railsのコミッターってやつをやってます 10 / 175

Slide 11

Slide 11 text

RailsのLuminaryってやつを やってます 11 / 175

Slide 12

Slide 12 text

で、Railsなんですけど、 12 / 175

Slide 13

Slide 13 text

Railsって なんか遅いらしいじゃないですか 13 / 175

Slide 14

Slide 14 text

たとえばこんな⽐較サイト 14 / 175

Slide 15

Slide 15 text

たとえばこんな⽐較サイト ! 523個中の382番⽬にやっと出てくる ! ("Web Framework"じゃないものもけっこう混じってて よくわからんランキングではあるけど) 15 / 175

Slide 16

Slide 16 text

どうにかしたい ! じゃあ改善しよう 16 / 175

Slide 17

Slide 17 text

パフォーマンスを改善するには まず何をしたら良いか? 17 / 175

Slide 18

Slide 18 text

まずは計測 ! ダイエットといっしょ ! 健康診断といっしょ 18 / 175

Slide 19

Slide 19 text

パフォーマンス改善のステップ 1. Railsのスピードを数値化する 2. 分析する 3. 数値を改善する 19 / 175

Slide 20

Slide 20 text

Rubyのいろんなパフォーマンスをはかるやつ https://github.com/ruby/ruby-bench 20 / 175

Slide 21

Slide 21 text

https://github.com/ruby/ruby-bench YJITの速さを ベンチマーク集 慢 計測するためにShopify社が作った 自 ! 21 / 175

Slide 22

Slide 22 text

ruby-benchの構造 ! フィボナッチみたいなやつからRailsまでカバーしてる ! harnessってやつでベンチマークの切り⼝をいろいろ指定できる 22 / 175

Slide 23

Slide 23 text

今回やりたい最適化の3段階 1. Railsのボトルネックの解消(アップストリーム) 2. Railsのマイクロオプティマイゼーション(アップストリーム) 3. Railsの魔改造(おたのしみ) 23 / 175

Slide 24

Slide 24 text

1. ボトルネックの解消 24 / 175

Slide 25

Slide 25 text

1. ボトルネックの解消 ! そんなものはない 25 / 175

Slide 26

Slide 26 text

1. ボトルネックの解消 おわり 26 / 175

Slide 27

Slide 27 text

2. マイクロ オプティマイゼーション ! 部分的なベンチマークでちょっとでも改善が⾒られたらよし(かもしれない)とする 27 / 175

Slide 28

Slide 28 text

計測対象 28 / 175

Slide 29

Slide 29 text

いちばん単純なやつから 始めてみる GET /up 29 / 175

Slide 30

Slide 30 text

ログとか⾒ながら 速くできるかもしれないところを探す 30 / 175

Slide 31

Slide 31 text

計測の指標 ! 普通はbenchmark-ipsてきな 31 / 175

Slide 32

Slide 32 text

もうひとつ別の指標 32 / 175

Slide 33

Slide 33 text

オブジェクト⽣成数 ! オブジェクトのアロケーション数 33 / 175

Slide 34

Slide 34 text

ちょっと前までRailsのログに 表⽰されてたやつ 34 / 175

Slide 35

Slide 35 text

Rails界でみんなが 気にしてるやつ ! フレームワークのレベルで削れるととてもデカい 35 / 175

Slide 36

Slide 36 text

Rails界でみんなが 気にしてるやつ ! (諸説あり) 36 / 175

Slide 37

Slide 37 text

ともあれ、 37 / 175

Slide 38

Slide 38 text

オブジェクトがたくさん⽣まれてるところは 遅そうな気がする 38 / 175

Slide 39

Slide 39 text

「スピード」と違って、ブレない数字なので 指標にすると便利 ! 環境に左右されない ! 再現性がある 39 / 175

Slide 40

Slide 40 text

ruby-benchでオブジェクト⽣成数をはかる harness ! ruby-benchには含まれていない ! なんかAIでサクッと 40 / 175

Slide 41

Slide 41 text

どこの処理でいくつオブジェクトが作られてい るか可視化 ! フレームグラフみたいなやつで、クリックしてドリルダウンできるwebアプリを作った ! なんかAIで ! とても便利 41 / 175

Slide 42

Slide 42 text

それを眺めながら削れるところを ちまちま削ってみる 42 / 175

Slide 43

Slide 43 text

みたいな作業を、 43 / 175

Slide 44

Slide 44 text

お⾒せできるといいんじゃないかな! ! 考えかたとか ! hotspotを探し当てるコツとか ! 最適化作業のウデの⾒せどころ的なやつとか ! ベンチマークの正しい取りかたとか 44 / 175

Slide 45

Slide 45 text

って思って、 45 / 175

Slide 46

Slide 46 text

実際にちょっとだけ⼿元でやってみて、 46 / 175

Slide 47

Slide 47 text

できそうな感触があったので プロポーザルを書いて出しました ! 2026年7⽉のことでした 47 / 175

Slide 48

Slide 48 text

で、本番 ! おととい ! そろそろ準備すっかー 48 / 175

Slide 49

Slide 49 text

プロポーザルを書いた⽇から 3ヶ⽉後 49 / 175

Slide 50

Slide 50 text

パッチ袋に3ヶ⽉寝かせてたパッチを いくつかrebase ! 熟成が効いててコンフリクトしまくり ! AIでピッと解消 50 / 175

Slide 51

Slide 51 text

で、おもむろに以下のプロンプト "Now that you understand the concept and the workflow, can you try digging more and finding more room for similar optimizations?" 51 / 175

Slide 52

Slide 52 text

出るわ出るわ 52 / 175

Slide 53

Slide 53 text

33ぷるり 53 / 175

Slide 54

Slide 54 text

いったんこれくらいで 勘弁してやろうか 54 / 175

Slide 55

Slide 55 text

「考えかたとか」? ! すんません、なんも頭使ってません。AIが全部やりましたÉÉ 55 / 175

Slide 56

Slide 56 text

ベンチマークどうしよっかな 56 / 175

Slide 57

Slide 57 text

もはや考えるのをやめた "Could you summarize the performance gains on various benchmarks?" 57 / 175

Slide 58

Slide 58 text

結果: アロケーション数 Endpoint | before | after | Change ---------------------------+----------+---------+-------/up | 400 | 271 | −32% Hello, World! | 322 | 250 | −22% scaffold index (20 rows) | 4611 | 2997 | −35% scaffold show | 593 | 512 | −14% scaffold new (form_with) | 1096 | 908 | −17% index.json (20 records) | 1479 | 1187 | −20% feed (collection partial) | 4195 | 3049 | −27% 58 / 175

Slide 59

Slide 59 text

結果: 実⾏時間 (µs) Endpoint | before | after | Change ---------------------------+----------+----------+-------/up | 93.8 | 79.4 | −15% Hello, World! | 82.2 | 74.3 | −10% scaffold index (20 rows) | 1231.6 | 1042.5 | −15% scaffold show | 177.4 | 168.2 | −5% scaffold new (form_with) | 310.8 | 269.6 | −13% index.json (20 records) | 318.1 | 298.0 | −6% feed (collection partial) | 939.7 | 807.4 | −14% 59 / 175

Slide 60

Slide 60 text

なんと、ここまでで15%の⾼速化を達成 ! Rails main (8.2.0) にコミット済み 60 / 175

Slide 61

Slide 61 text

てなわけで、 61 / 175

Slide 62

Slide 62 text

今回得られた知⾒ 62 / 175

Slide 63

Slide 63 text

アロケーション数と パフォーマンスの相関関係 ! それなりにある気がするよねえ 63 / 175

Slide 64

Slide 64 text

フレームワークやミドルウェアの チューニングは難しくない ! いまどき何も頭を使わなくてもほぼ全⾃動でAIでできる時代になりつつある ! 3ヶ⽉前とちがって 64 / 175

Slide 65

Slide 65 text

思うに、 65 / 175

Slide 66

Slide 66 text

新機能の実装や不具合の修正と 違って、「正解」がある ! 挙動が変わってないけどベンチマーク結果が改善されてたら正解 66 / 175

Slide 67

Slide 67 text

いわゆるOSSへの「コントリビュート」の ⼊り⼝としてアリでは ! 考えなきゃいけないことが少ないので 67 / 175

Slide 68

Slide 68 text

こんな地味な作業でも、チリツモで けっこうバカにならない 68 / 175

Slide 69

Slide 69 text

こうやってノイズを削っているうちに、 ラスボス(= 真のボトルネック) の姿が⾒えてくることがよくある 69 / 175

Slide 70

Slide 70 text

mameさんいわく、 70 / 175

Slide 71

Slide 71 text

mametter「ボトルネックを解消してないパフォ ーマンス改善パッチはゴミ」 71 / 175

Slide 72

Slide 72 text

かっけえ 72 / 175

Slide 73

Slide 73 text

とはいえ、 ! ⼀撃でラスボスを殴り倒せる戦闘⼒の裏付けがないとこういうことは⾔えない ! Railsみたいな巨⼤で複雑なソフトウェアに、そんなわかりやすいボトルネックなんて残って ない 73 / 175

Slide 74

Slide 74 text

庭の雑草を抜くぐらいの カジュアルなコントリビューション ! 個⼈的には良いものだと思ってます 74 / 175

Slide 75

Slide 75 text

ただし、 75 / 175

Slide 76

Slide 76 text

マイクロチューニングの宿命 ! 可読性とのトレードオフ 76 / 175

Slide 77

Slide 77 text

実例 + + + + + + def index_with(default = (no_default = true)) if block_given? to_h { |elem| [elem, yield(elem)] } # rubocop:disable Rails/IndexWith result = {} each { |elem| result[elem] = yield(elem) } result elsif no_default to_enum(:index_with) { size if respond_to?(:size) } else to_h { |elem| [elem, default] } # rubocop:disable Rails/IndexWith result = {} each { |elem| result[elem] = default } result end end 77 / 175

Slide 78

Slide 78 text

メンテナはこんなきたないものを メンテしたくない 78 / 175

Slide 79

Slide 79 text

メンテするならきれいで短いコードがいい 79 / 175

Slide 80

Slide 80 text

ミドルウェアみたいなところ以外ではやるべき ではない 80 / 175

Slide 81

Slide 81 text

ていうのと、⼈間がコードを読まなくなりつつ ある現代なら許されるコミット、なんじゃない かな 81 / 175

Slide 82

Slide 82 text

ともあれ、 82 / 175

Slide 83

Slide 83 text

まとめ 83 / 175

Slide 84

Slide 84 text

みんなもAIでパフォチューで Railsにコントリビュートしてこ? 84 / 175

Slide 85

Slide 85 text

このトークのねらい ! アプリケーションの話ばっかりじゃなくて、もっとRails本体の話をする⼈が増えてほしい。 だって、Railsのカンファレンスなんでしょ? ! テックカンファレンスは「IT勉強会」がデカくなっただけのものではない ! カンファレンスがエコシステムを駆動するようなものでありたい 85 / 175

Slide 86

Slide 86 text

ÉÉっていうふうな話をしようと思って、 7⽉にプロポーザルを出しました 86 / 175

Slide 87

Slide 87 text

さらに、ここから、Rails本体にパッチを当てる んじゃなくて、ベンチマークのスコアを上げる ためだけのしょーもないワークアラウンドを いろいろ披露するつもりでした 87 / 175

Slide 88

Slide 88 text

(ここまで10分ぐらいでサラッとしゃべる予定) 88 / 175

Slide 89

Slide 89 text

ところが、 89 / 175

Slide 90

Slide 90 text

2026年9⽉23⽇ ! テキサス州オースティン 90 / 175

Slide 91

Slide 91 text

Rails World 2026 91 / 175

Slide 92

Slide 92 text

いきなり世界が変わってしまった 92 / 175

Slide 93

Slide 93 text

DHH 93 / 175

Slide 94

Slide 94 text

DHH "Rails遅いからRustに乗り換えたわー" 94 / 175

Slide 95

Slide 95 text

これはやべえ 95 / 175

Slide 96

Slide 96 text

そのとき会場にいたMatzは 96 / 175

Slide 97

Slide 97 text

DHH vs Matz対談セッション 97 / 175

Slide 98

Slide 98 text

Matz 「Rubyが遅いならSpinelを使えばいいじゃない」 98 / 175

Slide 99

Slide 99 text

Ruby & Rails⻩⾦時代の終焉か? 99 / 175

Slide 100

Slide 100 text

「みんなもAIでパフォチューでRailsにコントリ ビュートしてこ?」 100 / 175

Slide 101

Slide 101 text

After Rails World 2026にこんな能天気なことやってる場合かÉÉ? 101 / 175

Slide 102

Slide 102 text

第1部完 To Be Continued... 102 / 175

Slide 103

Slide 103 text

第2部 103 / 175

Slide 104

Slide 104 text

Meet Pines 104 / 175

Slide 105

Slide 105 text

ということでここからが本題 105 / 175

Slide 106

Slide 106 text

第1部のまとめ ! Railsの時代は終わりつつある ! 時代はSpinel 106 / 175

Slide 107

Slide 107 text

Spinelとは? ! Matzが作っている3つ⽬のRuby処理系 ! AOTコンパイラ ! Prismで静的解析して、独⾃のコンパイラでネイティブバイナリにコンパイルしちゃう ! RubyKaigi 2026っていうイベントで発表されたらしい 107 / 175

Slide 108

Slide 108 text

「Rubyの50倍速い」 108 / 175

Slide 109

Slide 109 text

シンプルなRubyスクリプトならまあまあ動く ! Hello, World! ! fib 109 / 175

Slide 110

Slide 110 text

OptCarrotぐらいは動いているっぽい 110 / 175

Slide 111

Slide 111 text

すごそう 111 / 175

Slide 112

Slide 112 text

制約 ! できないことがいろいろある ! 詳しくはMatzのプレゼンやドキュメント参照 112 / 175

Slide 113

Slide 113 text

Matz 「Rubyが遅いならSpinelを使えばいいじゃない」 113 / 175

Slide 114

Slide 114 text

正気か? 114 / 175

Slide 115

Slide 115 text

Railsとか動くわけねーじゃん 115 / 175

Slide 116

Slide 116 text

Matzが⾔うところの 「Rails動いてる」 116 / 175

Slide 117

Slide 117 text

Roundhouse by Sam Ruby ! 本⼈がRubyConfで発表した ! Rubyスクリプトを他⾔語に翻訳して動かすやつらしい ! Spinelで動くものに変換することもできるとのこと ! なんか速いとのこと 117 / 175

Slide 118

Slide 118 text

めでてえじゃん 118 / 175

Slide 119

Slide 119 text

ほんとに? 119 / 175

Slide 120

Slide 120 text

でもどうやってるんだろう? 120 / 175

Slide 121

Slide 121 text

コードを⾒てみるとÉÉ 121 / 175

Slide 122

Slide 122 text

ものすごいアドホックな書き換えの数々 ! この⽅針で安定させるのは⼤変そうÉÉ 122 / 175

Slide 123

Slide 123 text

たぶん、Spinel側にもRails側にも いろいろワークアラウンドを⼊れて、 すごく限定的な何かが動いてる状態 123 / 175

Slide 124

Slide 124 text

なんかとりあえず⼒技で動いたことにして数字 をアピールするマーケティングっていう段階 124 / 175

Slide 125

Slide 125 text

ただ、Railsアプリを⾼速なランタイムで動かす というアイデアと実装の先駆者としては、 めちゃめちゃリスペクトしてます! ! (このページは、講演後に追加したものです。とても⼤事なことなのに壇上で⾔及するのを忘 れてしまいました。たいへん申し訳ございませんでした) 125 / 175

Slide 126

Slide 126 text

この⽅針で「動いてる」状態を 維持するのは⼤変そうÉÉ 126 / 175

Slide 127

Slide 127 text

Rails World会場にて ! Matz「Spinel on Rails⼀緒にやろうぜ」 ! Matz「Roundhouse使わないでも動くようにしたいんだよね」 ! Matz「僕はRailsのことよくわかんないから動くようにしといて」 127 / 175

Slide 128

Slide 128 text

俺「マジかよ〜」 128 / 175

Slide 129

Slide 129 text

まあでもやってみることにした ! あの会場に居合わせたのもきっと何かのご縁なんでしょう 129 / 175

Slide 130

Slide 130 text

基本⽅針 ! RailsとSpinelの間にプリプロセッサを1枚嚙ます ! ワークアラウンドに逃げずにボトムアップで全部ちゃんとやる ! なるべくちゃんとSpinelのアップストリームを直す 130 / 175

Slide 131

Slide 131 text

やってみた 131 / 175

Slide 132

Slide 132 text

Spinelぜんぜん動いてねーじゃん! ! ファミコンが動いたからといってRailsが動くわけじゃないんだなー 132 / 175

Slide 133

Slide 133 text

Let's seriously make Rails on Spinel happen 133 / 175

Slide 134

Slide 134 text

進め⽅ 134 / 175

Slide 135

Slide 135 text

いくつかのフェーズに分けて 1. Gemを読めるようにする 2. Active Supportが動くようにする 3. Action PackでシンプルなHTTP request/response 4. Active Recordでクエリ 5. rails newしたアプリ 6. scaffoldアプリ 135 / 175

Slide 136

Slide 136 text

「Spinelで動く」には3つの段階 1. コンパイルが通る 2. 実⾏できる 3. 実⾏結果がCRubyと同じ 136 / 175

Slide 137

Slide 137 text

最終的にRubyと同じになるように すればよいので ! 答えのある問題 ! つまりAIの得意分野 ! というか丸投げできる ! さっきのパフォチューの話と⼀緒ですね 137 / 175

Slide 138

Slide 138 text

Pines ! SpinelとRailsの間のglueライブラリ ! アドホックの寄せ集め ! "spinel"のアナグラム的な 138 / 175

Slide 139

Slide 139 text

9⽉27⽇(4.days.since(RailsWorld)) ! Active Supportの全機能がそれぞれ単体で動くようになった! ! この時点で、まつもとさんに「やれそうです」と報告 ! Spinelへのアップストリーミングを開始 139 / 175

Slide 140

Slide 140 text

ここからのSpinelリポジトリの 盛り上がりっぷりがすごい 140 / 175

Slide 141

Slide 141 text

Pinesの進捗 141 / 175

Slide 142

Slide 142 text

3. Action Packでシンプルな HTTP request/response ! WEBRickでそれっぽいものが返せるものはできた 142 / 175

Slide 143

Slide 143 text

4. Active Record ! 動的なコードが多いのでむずかしい ! メソッド呼び出しのたらい回しが多くてむずかしい 143 / 175

Slide 144

Slide 144 text

4. Active Record gem "activerecord", "8.1.4"; gem "activesupport", "8.1.4"; gem "sqlite3", "2.9.6" require "active_record" require "active_record/connection_adapters/sqlite3_adapter" ActiveRecord::Base.establish_connection(adapter: "sqlite3", database: ":memory:") ActiveRecord::Base.connection.execute(<<~SQL) CREATE TABLE users (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, age INTEGER) SQL class User < ActiveRecord::Base end User.create!(name: "alice", age: 30) User.create!(name: "bob", age: 25) User.create!(name: "carol", age: 35) puts User.count p User.where(name: "bob").pluck(:id, :name, :age) p User.where("age > ?", 26 u = User.find(1) puts "#{u.id} #{u.name} #{ p User.find_by(name: "nobody") 144 / 175

Slide 145

Slide 145 text

なんと、これをコンパイルするのに 10時間かかる! ! M1 Pro, MacOS, 32GB 145 / 175

Slide 146

Slide 146 text

時間が⾷われている部分 ! 型推論フェーズ? 146 / 175

Slide 147

Slide 147 text

Rails本体とかgemの型だったら RBSで書いて喰わせちゃえばいいのでは?! 147 / 175

Slide 148

Slide 148 text

やってみた 148 / 175

Slide 149

Slide 149 text

https://github.com/ruby/gem_rbs_collection 149 / 175

Slide 150

Slide 150 text

Rails 8.1の全コンポーネントの RBSをコミットしておきました ! 今回の⼀連の作業で唯⼀、皆さまに今⽇からでもお役⽴ていただけるアウトプットかも 150 / 175

Slide 151

Slide 151 text

RBSアリ/ナシのコンパイル速度の⽐較 TODO 151 / 175

Slide 152

Slide 152 text

5. rails newしたアプリ 152 / 175

Slide 153

Slide 153 text

5. rails newしたアプリ ! こんなんまったく無理。コンパイルが終わらない 153 / 175

Slide 154

Slide 154 text

ターゲット変更 ! 5. rails newしたアプリ ! 5. rails newしたアプリを極限まで⼩さくしたやつ 154 / 175

Slide 155

Slide 155 text

依存はこれだけ gem "railties" gem "actionpack" gem "webrick" gem "rackup" 155 / 175

Slide 156

Slide 156 text

10/14 これでも2時間経ってもコンパイルが終わらないÉÉ 日 ! 夜 発表直前 156 / 175

Slide 157

Slide 157 text

Benchmarks ! いちおう現時点で取れる数字を載せるだけ載せておきます ! そういえば今⽇のお題はBenchmarkだった気がするのでÉÉ ! (発表当⽇時点での着地点はまだまったく⾒えていません) 157 / 175

Slide 158

Slide 158 text

まとめ 158 / 175

Slide 159

Slide 159 text

本⽇のトピック 159 / 175

Slide 160

Slide 160 text

Web Framework Benchmark Battle 2026, Any% 160 / 175

Slide 161

Slide 161 text

DHHとMatzのせいで、プロポーザルに書いた内容 と違うトークになってしまいました 161 / 175

Slide 162

Slide 162 text

オーガナイザー、オーディエンスの皆さまには お詫び申し上げます 162 / 175

Slide 163

Slide 163 text

でも時代が変わっちゃったんだから しょうがない 163 / 175

Slide 164

Slide 164 text

しょうがないというか、この2026年10⽉という 激変期にふさわしいトピックを持ってこようと 思ったらこうせざるを得ませんでした 164 / 175

Slide 165

Slide 165 text

時代はSpinel 165 / 175

Slide 166

Slide 166 text

SpinelはRubyなのか? ! .rbファイルがなんか動くからRuby ! Matzが作ってるからRuby ! ってMatzが⾔ってた 166 / 175

Slide 167

Slide 167 text

Spinel + AI ! 今まで⼈類が30年かけて丁寧に築いてきたものをAIがネイティブバイナリで書き出す作業 ! 開発速度がえぐい 167 / 175

Slide 168

Slide 168 text

Spinel on Rails ! 今のところは使い物になるかどうかは不明 ! Pinesってやつを使えば動くようになる未来が来る、かもしれない ! もしかしたらすっごい速い、かもしれない ! コンパイルに異常に時間がかかる、かもしれない ! すっごい速いぱそこんを買ったら解決する、かもしれない 168 / 175

Slide 169

Slide 169 text

Current status 169 / 175

Slide 170

Slide 170 text

"Not working yet" "The runner still doesn't boot." 170 / 175

Slide 171

Slide 171 text

今後の⽅針とか ! SpinelのRuby互換性の改良 ! C-ext => Ruby ! PinesはSpinel側あるいはRails側に少しずつ還元していって、いずれはPinesがなくてもRails が動くようになるのが理想、かなあ 171 / 175

Slide 172

Slide 172 text

所感 ! ここに来て既存のRBSエコシステムが重要になってきたのとかアツい ! 個⼈的にはpure Rubyでシェル作ったりしてたのとも繋がってきてたりしておもろい 172 / 175

Slide 173

Slide 173 text

時代はSpinel 173 / 175

Slide 174

Slide 174 text

かなぁ? 174 / 175

Slide 175

Slide 175 text

end (game over...) 175 / 175