Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
RubyでRuby拡張を書いたらRubyより35倍速になったってどういうこと??
Search
kazuho
May 25, 2026
Technology
1.1k
3
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
RubyでRuby拡張を書いたらRubyより35倍速になったってどういうこと??
kazuho
May 25, 2026
More Decks by kazuho
See All by kazuho
Rapid Start: Faster Internet Connections, with Ruby's Help
kazuho
2
1.3k
SCONE - 動画配信の帯域を最適化する新プロトコル
kazuho
2
2.3k
HTTP優先度制御の今後とビデオ配信
kazuho
1
160
Encrypted SNI
kazuho
5
7k
Security, privacy, performance of next-generation transport protocols
kazuho
8
41k
TLS 1.3とその周辺の標準化動向
kazuho
0
9.9k
Fastlyのプログラマから見たCDN
kazuho
29
19k
Other Decks in Technology
See All in Technology
Agentic Defenseとともにセキュリティエンジニアが輝き続けるには / How Security Engineers Can Keep Excelling with Agentic Defense
yuj1osm
0
110
製造業のクラウド活用最適解〜AI,DXを加速するデータ基盤の作り方〜
hamadakoji
0
400
チームで実践する AI-DLC 思考の軌跡を残すチェックポイント設計
belongadmin
0
2.8k
Ruby::Boxでできること、Refinementsでできること
joker1007
3
400
ChatworkとBPaaS 異なる特性で学んだAI機能開発の ベストプラクティス
kubell_hr
2
2.9k
ABEMA の Datadog × OTel 基盤、 中から見るか? 外から見るか?
tetsuya28
0
100
新規事業を牽引する技術選定 〜フルスタックTypeScript開発の実践事例〜
nullnull
3
360
マーケットプレイス版Oracle WebCenter Content For OCI
oracle4engineer
PRO
5
1.8k
個人最適 から 全体最適 へ AI情報共有会・AIギルド・AI-DLC で進める カンリーの組織展開
rfdnxbro
0
1.7k
AIプラットフォームを運用し続けるための可観測性
tanimuyk
4
1.1k
DevOps Agentで始めるAWS運用 〜フロンティアエージェントが変える運用の現場〜
nyankotaro
1
270
先取りMaven4 ~16年ぶりのメジャーアップデート、その進化とは?~
ogiwarat
0
150
Featured
See All Featured
Digital Projects Gone Horribly Wrong (And the UX Pros Who Still Save the Day) - Dean Schuster
uxyall
0
1.6k
Exploring the relationship between traditional SERPs and Gen AI search
raygrieselhuber
PRO
2
4k
Designing for Timeless Needs
cassininazir
1
250
New Earth Scene 8
popppiees
3
2.3k
Data-driven link building: lessons from a $708K investment (BrightonSEO talk)
szymonslowik
1
1.1k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
508
140k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
12
1.2k
SEO Brein meetup: CTRL+C is not how to scale international SEO
lindahogenes
1
2.7k
The Invisible Side of Design
smashingmag
302
52k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
34
2.8k
A Soul's Torment
seathinner
6
2.9k
Bioeconomy Workshop: Dr. Julius Ecuru, Opportunities for a Bioeconomy in West Africa
akademiya2063
PRO
1
130
Transcript
RubyでRuby拡張を 書いたらRubyより 35倍速になったって どういうこと?? Kazuho Oku
• インターネットを、より速く・より安全・より効率化する仕事 をしています 普段のお仕事 2
• インターネットを、より速く・より安全・より効率化する仕事 をしています ◦ Fastlyが使うHTTPサーバ「H2O」の設計実装 ▪ HTTP/1.1, 2, 3, TLS,
QUIC 普段のお仕事 3
• インターネットを、より速く・より安全・より効率化する仕事 をしています ◦ Fastlyが使うHTTPサーバ「H2O」の設計実装 ▪ HTTP/1.1, 2, 3, TLS,
QUIC ◦ 通信プロトコルの標準化 ▪ HTTPの優先度制御や Early Hints ▪ TLSのハンドシェイク暗号化 (Encrypted Client Hello) ▪ QUICのパケット番号暗号化 普段のお仕事 4
• Rapid Startという、従来の「スロースタート」より立ち上が りが速い輻輳制御を設計〜導入した Rubykaigiで発表したこと 5
• Rapid Startという、従来の「スロースタート」より立ち上が りが速い輻輳制御を設計〜導入した • その過程で、 jrfというjq的なツールを作った ◦ Cで書かれている jqに対し、jrfはRuby
Rubykaigiで発表したこと 6
• Rapid Startという、従来の「スロースタート」より立ち上が りが速い輻輳制御を設計〜導入した • その過程で、 jrfというjq的なツールを作った ◦ Cで書かれている jqに対し、jrfはRuby
◦ Rubyだから ▪ 単一スレッドで 3倍以上高速 ▪ 自動並列化で 20倍以上高速 Rubykaigiで発表したこと 7
• Rapid Startという、従来の「スロースタート」より立ち上が りが速い輻輳制御を設計〜導入した • その過程で、 jrfというjq的なツールを作った ◦ Cで書かれている jqに対し、jrfはRuby
◦ Rubyだから ▪ 単一スレッドで 3倍以上高速 ▪ 自動並列化で 20倍以上高速 • cf. Rapid Start: Faster Internet Connections, with Ruby’s Help Rubykaigiで発表したこと 8
• CRubyは着実に速くなってるが、速くしてくのは大変 ◦ cf. The design and implementation of ZJIT
& the next five years Rubykaigiで聞いたこと 9
• CRubyは着実に速くなってるが、速くしてくのは大変 ◦ cf. The design and implementation of ZJIT
& the next five years • 正規表現エンジンの呼び出しが複雑なこと、かと言って pure-Rubyだと遅いこと ◦ cf. (Re)make Regexp in Ruby: Democratizing internals for the JIT Rubykaigiで聞いたこと 10
• CRubyは着実に速くなってるが、速くしてくのは大変 ◦ cf. The design and implementation of ZJIT
& the next five years • 正規表現エンジンの呼び出しが複雑なこと、かと言って pure-Rubyだと遅いこと ◦ cf. (Re)make Regexp in Ruby: Democratizing internals for the JIT • Spinelという静的型推論を使う AOT処理系ができたこと ◦ cf. Matz Keynote Rubykaigiで聞いたこと 11
• 型推論ができる範囲のコードなら C並に速くなるのか Matz Keynoteを聴きながら ... 12
• 型推論ができる範囲のコードなら C並に速くなるのか • プロトコル実装や正規表現の処理系は、ステートマシンだ し、うまくハマりそうだな ... Matz Keynoteを聴きながら ...
13
• 型推論ができる範囲のコードなら C並に速くなるのか • プロトコル実装や正規表現の処理系は、ステートマシンだ し、うまくハマりそうだな ... • そして、Rubyから呼ばれる部分は APIに絞られるんだか
ら、そこだけつないでやれば、 SpinelでRuby拡張書ける のでは... Matz Keynoteを聴きながら ... 14
東京に帰るぞ! …自転車で 15
• よし正規表現エンジンを Spinelで作ってみるぞ! 八戸駅から新幹線に乗りました 16
• よし正規表現エンジンを Spinelで作ってみるぞ! • 「「「「AIが」」」」 八戸駅から新幹線に乗りました 17
regexpinelの設計方針 18 NFA engine nr_core_match関数 (regexpinel/core.rb) regexp compiler (lib/compiler*.rb) 命令
列 文字列 マッチ
regexpinelの設計方針 19 NFA engine nr_core_match関数 (regexpinel/core.rb) regexp compiler (lib/compiler*.rb) 命令
列 文字列 マッチ こいつをspinelでコンパイルし たC関数に差し替えたい
• spinelの生成するコードは GCを使ってはダメ ◦ CRubyの中で別の ruby処理系を動かしたいわけでは ない Spinelを使ったCRuby拡張の作り方 20
• spinelの生成するコードは GCを使ってはダメ ◦ CRubyの中で別の ruby処理系を動かしたいわけでは ない • proof_vm_argv.rb: ◦
コマンドラインで VM命令列、文字列を受け取り ◦ nr_core_matchを呼び出し ◦ マッチがある度に標準出力に出力 Spinelを使ったCRuby拡張の作り方 21
• spinelの生成するコードは GCを使ってはダメ ◦ CRubyの中で別の ruby処理系を動かしたいわけでは ない • proof_vm_argv.rb: ◦
コマンドラインで VM命令列、文字列を受け取り ◦ nr_core_matchを呼び出し ◦ マッチがある度に標準出力に出力 Spinelを使ったCRuby拡張の作り方 22 spinelがコンパイルする コードでArray#pushする とGCが呼び出される!
• spinelの生成するコードは GCを使ってはダメ ◦ CRubyの中で別の ruby処理系を動かしたいわけでは ない • proof_vm_argv.rb: ◦
コマンドラインで VM命令列、文字列を受け取り ◦ nr_core_matchを呼び出し ◦ マッチがある度に標準出力に出力 • ↑ これをspinelでコンパイル Spinelを使ったCRuby拡張の作り方 23 spinelがコンパイルする コードでArray#pushする とGCが呼び出される!
• spinelの生成するコードは GCを使ってはダメ ◦ CRubyの中で別の ruby処理系を動かしたいわけでは ない • proof_vm_argv.rb: ◦
コマンドラインで VM命令列、文字列を受け取り ◦ nr_core_matchを呼び出し ◦ マッチがある度に標準出力に出力 • ↑ これをspinelでコンパイル ◦ main関数を消す ◦ マッチ位置を出力してる部分を差し替え Spinelを使ったCRuby拡張の作り方 24 spinelがコンパイルする コードでArray#pushする とGCが呼び出される!
github.com/kazuho/regexpinel 成果物 25
ベンチマーク 26
短い文字列のマッチ 27 Ops/秒 vs. CRuby CRuby Regexp 19,037,261 1.00x Regexpinel
(pure-Ruby) 902,166 0.05x Regexpinel (compiled) 31,925,547 1.68x
短い文字列のマッチ 28 Ops/秒 vs. CRuby CRuby Regexp 19,037,261 1.00x Regexpinel
(pure-Ruby) 902,166 0.05x Regexpinel (compiled) 31,925,547 1.68x 35倍速!!!
短い文字列の sub 29 Ops/秒 vs. CRuby CRuby Regexp 5,180,703 1.00x
Regexpinel (pure-Ruby) 389,489 0.08x Regexpinel (compiled) 12,814,179 2.47x
短い文字列の gsub 30 Ops/秒 vs. CRuby CRuby Regexp 3,168,890 1.00x
Regexpinel (pure-Ruby) 295,045 0.09x Regexpinel (compiled) 10,993,974 3.47x
長い文字列のマッチ (MB/s) 31 CRuby Regexpinel (pure-Ruby) Regexpinel (compiled) z*ab (マッチ)
362.2 1.0 349.3 z*ab (ミス) 3,918.6 1.0 345.1 a+b (マッチ) 417.0 1.1 439.6 a+b (ミス) 413.7 1.1 415.3 é*x (マッチ) 387.8 2.1 668.6
まとめ 32
• CRubyが、もっと速くなるといいな ◦ そしたらなんでも Rubyで書けるし • 待てないなら Spinelで拡張を書くのも面白い! ◦ 既存手法
(Cライブラリと組み合わせ ) より速くなったよ まとめ 33