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
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
kazuho
May 25, 2026
Technology
110
1
Share
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.2k
SCONE - 動画配信の帯域を最適化する新プロトコル
kazuho
2
2.1k
HTTP優先度制御の今後とビデオ配信
kazuho
1
150
Encrypted SNI
kazuho
5
7k
Security, privacy, performance of next-generation transport protocols
kazuho
8
41k
TLS 1.3とその周辺の標準化動向
kazuho
0
9.8k
Fastlyのプログラマから見たCDN
kazuho
29
19k
Other Decks in Technology
See All in Technology
データ分析基盤の信頼を支える視点と設計
yuki_saito
0
130
LT準備のToilを削減 〜決定論×確率論のスライド生成CLI〜
shukob
0
110
M&Aで増え続けるプロダクトに少数QAはどう立ち向かうか─GENDAが挑む、全員で取り組む品質標準化戦略 / GENDA Tech Talk #4
genda
0
280
【新卒研修】ライブデモ + compose.yaml読解_講義資料
dip_tech
PRO
0
110
インプロセスQAのための要因から捉えるプロジェクトリスクマネジメントnano #1 開発リソース効率状態への対処 #jasstnano
barus_qa
0
210
10サービス以上のメール到達率改善を地道に継続的に進めている話 / Continue to improve email delivery rates across multiple services
yamaguchitk333
6
2.3k
エムスリーテクノロジーズ株式会社 エンジニア向け紹介資料 / M3 Technologies Company Deck
m3_engineering
0
200
O'Reilly Infrastructure & Ops Superstream: Platform Engineering for Developers, Architects & the Rest of Us
syntasso
0
330
AIコーディングエージェントの活用で、コードは静かに肥大化した
yosukeshinoda
1
130
How to learn AWS Well-Architected with AWS BuilderCards: Security Edition
coosuke
PRO
0
200
[4] Power BI Deep Dive [2026-05]
ohata_bi
0
110
Fラン学生が考える、AI時代のデザインに執着した突破口
husengs7
1
230
Featured
See All Featured
Odyssey Design
rkendrick25
PRO
2
620
Principles of Awesome APIs and How to Build Them.
keavy
128
17k
Design in an AI World
tapps
1
210
Side Projects
sachag
455
43k
The agentic SEO stack - context over prompts
schlessera
0
780
Mobile First: as difficult as doing things right
swwweet
225
10k
Learning to Love Humans: Emotional Interface Design
aarron
275
41k
How To Speak Unicorn (iThemes Webinar)
marktimemedia
1
460
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
25
1.9k
jQuery: Nuts, Bolts and Bling
dougneiner
66
8.5k
Site-Speed That Sticks
csswizardry
13
1.2k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.7k
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