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
1.2k
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.5k
SCONE - 動画配信の帯域を最適化する新プロトコル
kazuho
2
2.5k
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
[MIRU26] To What Extent Does MLLM-as-a-Judge Exhibit Cross-Model Preference Bias?
keio_smilab
PRO
0
100
最高のシステムプロンプトを作るためにフィードバック機能を導入した話
alchemy1115
1
270
Webの技術とガジェットで子どもも大人も楽しめるワクワク体験を提供する / Qiita Tech Festa Day 2026
you
PRO
1
330
歴史から理解するクラウドインフラのしくみ
kizawa2020
1
200
AIで楽になるはずが、なぜ疲れる?
kinopeee
0
150
NYC Summit 2026 におけるAmazon Bedrock AgentCore のアップデート
ren8k
3
300
AI工学特論: MLOps・継続的評価
asei
11
3.1k
PLaMo 3.0 Primeの構造化出力サポート
pfn
PRO
0
160
AIQAのナレッジ構築について
qatonchan
1
140
MIRU 2026 チュートリアル
keisuke198619
0
420
大 AI 時代におけるC# の事情 ~ぶっちゃけトークを交えながら~
nenonaninu
1
620
事業成長とAI活用を止めないデータ基盤アーキテクチャの設計思想
hiracky16
0
790
Featured
See All Featured
Automating Front-end Workflow
addyosmani
1370
210k
Game over? The fight for quality and originality in the time of robots
wayneb77
1
230
Crafting Experiences
bethany
1
230
Building an army of robots
kneath
306
46k
<Decoding/> the Language of Devs - We Love SEO 2024
nikkihalliwell
1
280
Understanding Cognitive Biases in Performance Measurement
bluesmoon
32
3k
Lightning Talk: Beautiful Slides for Beginners
inesmontani
PRO
2
620
The Pragmatic Product Professional
lauravandoore
37
7.4k
技術選定の審美眼(2025年版) / Understanding the Spiral of Technologies 2025 edition
twada
PRO
119
120k
Reflections from 52 weeks, 52 projects
jeffersonlam
356
21k
Building Applications with DynamoDB
mza
96
7.1k
エンジニアに許された特別な時間の終わり
watany
108
250k
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