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
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
既存プロダクトQAから新規プロダクトQAへ
ryotakahashi
0
170
Oracle AI Database@AWS:サービス概要のご紹介
oracle4engineer
PRO
4
2.6k
自作エディターをOSSにして分かった、一人に刺さる開発が世界を動かす理由
shinyasaita
0
140
TSKaigi 2026 - enumよ、さようなら
teamlab
PRO
2
250
AWS WAFの運用を地道に改善し、自社で運用可能にするプラクティス
andpad
1
640
O'Reilly Infrastructure & Ops Superstream: Platform Engineering for Developers, Architects & the Rest of Us
syntasso
0
330
10サービス以上のメール到達率改善を地道に継続的に進めている話 / Continue to improve email delivery rates across multiple services
yamaguchitk333
6
2.3k
[みん強]AIの価値を最大化するデータ基盤戦略:Self-Service型Data Meshへの転換とAgentic AI Meshに向けた取り組み with Snowflake他
y_matsubara
1
160
Purview Endpoint DLP 動かしてみた
kozakigh
1
460
JaSSTに関わることで変わった人生観 #jasstnano
makky_tyuyan
0
170
ラズパイ & Picoで入門:Zephyr(RTOS)の環境構築からビルドまでの紹介
iotengineer22
0
150
サプライチェーン攻撃への備えについて考えている #湘なんか
stefafafan
2
2.1k
Featured
See All Featured
From π to Pie charts
rasagy
0
180
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
141
35k
Large-scale JavaScript Application Architecture
addyosmani
515
110k
How STYLIGHT went responsive
nonsquared
100
6.1k
Ten Tips & Tricks for a 🌱 transition
stuffmc
0
110
YesSQL, Process and Tooling at Scale
rocio
174
15k
Reflections from 52 weeks, 52 projects
jeffersonlam
356
21k
Getting science done with accelerated Python computing platforms
jacobtomlinson
2
200
Navigating Weather and Climate Data
rabernat
0
190
Lessons Learnt from Crawling 1000+ Websites
charlesmeaden
PRO
1
1.2k
Mobile First: as difficult as doing things right
swwweet
225
10k
GraphQLとの向き合い方2022年版
quramy
50
15k
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