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
GraphQL Ruby をちょっとだけ速くした / Make graphql-ruby fa...
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
Fumiaki MATSUSHIMA
July 25, 2020
Programming
780
1
Share
GraphQL Ruby をちょっとだけ速くした / Make graphql-ruby faster a bit
Kaigi on Rails new LT 発表資料
https://kaigionrails.doorkeeper.jp/events/109773
Fumiaki MATSUSHIMA
July 25, 2020
More Decks by Fumiaki MATSUSHIMA
See All by Fumiaki MATSUSHIMA
Learning from performance improvements on GraphQL Ruby
mtsmfm
1
1.3k
Ruby で作る Ruby (物理)
mtsmfm
1
270
GraphQL Ruby benchmark
mtsmfm
1
900
タイムアウトにご用心 / Timeout might break application state
mtsmfm
6
2.7k
Build REST API with GraphQL Ruby
mtsmfm
0
390
Gaming PC on GCP
mtsmfm
0
800
How to introduce GraphQL to an existing React-Redux application
mtsmfm
1
300
Canary release in StudySapuri
mtsmfm
0
3.2k
Analyze Rails CI
mtsmfm
2
1k
Other Decks in Programming
See All in Programming
Server-Side Kotlin LT大会 vol.18 [Kotlin-lspの最新情報と Neovimのlsp設定例]
yasunori0418
1
180
VueエンジニアがReactを触って感じた_設計の違い
koukimiura
0
180
GoogleCloudとterraform完全に理解した
terisuke
1
150
Lightning-Fast Method Calls with Ruby 4.1 ZJIT / RubyKaigi 2026
k0kubun
3
1.2k
mruby on C#: From VM Implementation to Game Scripting (RubyKaigi 2026)
hadashia
2
620
JOAI2026 1st solution - heron0519 -
heron0519
0
150
セグメントとターゲットを意識するプロポーザルの書き方 〜採択の鍵は、誰に刺すかを見極めるマーケティング戦略にある〜
m3m0r7
PRO
0
580
Angular Signal Forms
debug_mode
0
120
ふりがな Deep Dive try! Swift Tokyo 2026
watura
0
230
エラー処理の温故知新 / history of error handling technic
ryotanakaya
4
1.1k
アクセシビリティ試験の"その後"を仕組み化する
yuuumiravy
1
170
ついに来た!本格的なマルチクラウド時代の Google Cloud
maroon1st
0
230
Featured
See All Featured
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
25
1.9k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
32
2.9k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
666
130k
End of SEO as We Know It (SMX Advanced Version)
ipullrank
3
4.1k
New Earth Scene 8
popppiees
3
2.1k
技術選定の審美眼(2025年版) / Understanding the Spiral of Technologies 2025 edition
twada
PRO
118
110k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
122
21k
Stewardship and Sustainability of Urban and Community Forests
pwiseman
0
180
Leading Effective Engineering Teams in the AI Era
addyosmani
9
1.9k
Jess Joyce - The Pitfalls of Following Frameworks
techseoconnect
PRO
1
140
Fireside Chat
paigeccino
42
3.9k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
16k
Transcript
#kaigionrails GraphQL Ruby をちょっとだけ速くした GraphQL Ruby を ちょっとだけ速くした @mtsmfm Fumiaki
Matsushima Kaigi on Rails new #kaigionrails
#kaigionrails GraphQL Ruby をちょっとだけ速くした ➔ Web Dev at Quipper ➔
Dead by Daylight 仲間募集 ➔ 西日暮里.rb 主催 ➔ GraphQL Tokyo 主催 @mtsmfm.inspect
#kaigionrails GraphQL Ruby をちょっとだけ速くした https://nishinipporirb.doorkeeper.jp/events/108780
#kaigionrails GraphQL Ruby をちょっとだけ速くした https://www.meetup.com/ja-JP/GraphQL-Tokyo/
#kaigionrails GraphQL Ruby をちょっとだけ速くした 5 GraphQL とは - POST /graphql
{“query”: “{ articles { title }”} したら {“data”: {“articles”: [{“title”: “Hi”}]}} を返すやつ
#kaigionrails GraphQL Ruby をちょっとだけ速くした 6 社内でいくつか GraphQL を導入 - あれ
- これ - それ
#kaigionrails GraphQL Ruby をちょっとだけ速くした 7 ある日鳴る SLO アラート - そのサービスは
90 % 300 ms - 社内サービスなので顧客に約束しているわけではない が放置は NG - 遅い GraphQL クエリがあった
#kaigionrails GraphQL Ruby をちょっとだけ速くした - これでも 200ms 弱くらい 遅いクエリ 8
※リソース名などは実際と異なります
#kaigionrails GraphQL Ruby をちょっとだけ速くした - これすら 70ms 弱 遅いクエリ 9
#kaigionrails GraphQL Ruby をちょっとだけ速くした10 遅いクエリ - DB?
#kaigionrails GraphQL Ruby をちょっとだけ速くした - DB? ❌ - -> 起動時に
YAML を読んで、そこから返している 11 遅いクエリ
#kaigionrails GraphQL Ruby をちょっとだけ速くした12 遅いクエリ - 件数?
#kaigionrails GraphQL Ruby をちょっとだけ速くした - 件数? - -> articles が
20、relatedArticles が 50 ずつくらい - 20 * 50 = 1000 - 多いしクエリの改善の余地がありそう - 実際はクエリをなんとかした - 好奇心: 多くはあるが数百ms もいくか? 13 遅いクエリ
#kaigionrails GraphQL Ruby をちょっとだけ速くした プロファイリング 14 - GraphQL Ruby が怪しい気がする
- とりあえず ruby-prof
#kaigionrails GraphQL Ruby をちょっとだけ速くした15 https://ruby-prof.github.io/
#kaigionrails GraphQL Ruby をちょっとだけ速くした16 ようするにこう
#kaigionrails GraphQL Ruby をちょっとだけ速くした17 CallStackPrinter
#kaigionrails GraphQL Ruby をちょっとだけ速くした18 %self total self wait child calls
name location 5.96 0.659 0.044 0.000 0.615 19241 *<Module::GraphQL::Execution::Execute::ExecutionFunctions>#resolve_value /usr/local/bundle/gems/graphql-1.11.1/lib/graphql/execution/execute.rb:220 5.46 0.156 0.041 0.000 0.115 44528 Concurrent::Collection::MriMapBackend#compute_if_absent bench.rb:14 4.97 0.252 0.037 0.000 0.215 24284 *GraphQL::Schema::LazyHandlingMethods#after_lazy /usr/local/bundle/gems/graphql-1.11.1/lib/graphql/schema.rb:104 3.96 0.079 0.029 0.000 0.049 44532 Thread::Mutex#synchronize 3.95 0.036 0.029 0.000 0.007 44528 Concurrent::Collection::NonConcurrentMapBackend#_get /usr/local/bundle/gems/concurrent-ruby-1.1.6/lib/concurrent-ruby/concurrent/collection/map/non_concurrent_map_backend.rb:19 3.61 0.727 0.027 0.000 0.700 6456 *Hash#each FlatPrinter
#kaigionrails GraphQL Ruby をちょっとだけ速くした19 %self total self wait child calls
name location 5.96 0.659 0.044 0.000 0.615 19241 *<Module::GraphQL::Execution::Execute::ExecutionFunctions>#resolve_value /usr/local/bundle/gems/graphql-1.11.1/lib/graphql/execution/execute.rb:220 5.46 0.156 0.041 0.000 0.115 44528 Concurrent::Collection::MriMapBackend#compute_if_absent bench.rb:14 4.97 0.252 0.037 0.000 0.215 24284 *GraphQL::Schema::LazyHandlingMethods#after_lazy /usr/local/bundle/gems/graphql-1.11.1/lib/graphql/schema.rb:104 3.96 0.079 0.029 0.000 0.049 44532 Thread::Mutex#synchronize 3.95 0.036 0.029 0.000 0.007 44528 Concurrent::Collection::NonConcurrentMapBackend#_get /usr/local/bundle/gems/concurrent-ruby-1.1.6/lib/concurrent-ruby/concurrent/collection/map/non_concurrent_map_backend.rb:19 3.61 0.727 0.027 0.000 0.700 6456 *Hash#each FlatPrinter
#kaigionrails GraphQL Ruby をちょっとだけ速くした20 Concurrent::Collection:: MriMapBackend#compute_if_absent - map.compute_if_absent(key) { calc(key)
} - ようは hash[:a] ||= ‘a’ みたいな
#kaigionrails GraphQL Ruby をちょっとだけ速くした21 Concurrent::Collection:: MriMapBackend#compute_if_absent - GraphQL Ruby 内では遅延評価するべきかど
うかの判定に使っている (?) - graphql-batch など resolver が Promise なとき用? - 毎度 nil 返ってる
#kaigionrails GraphQL Ruby をちょっとだけ速くした22 Concurrent::Collection:: MriMapBackend#compute_if_absent https://github.com/ruby-concurrency/concurrent-ruby/blob/f749b81cb6c6291640c0004b57e60dbc2b59 a72b/lib/concurrent-ruby/concurrent/collection/map/mri_map_backend.rb#L21-L27
#kaigionrails GraphQL Ruby をちょっとだけ速くした Key があっても格納された値が Falsy なときに毎回 lock とってた
23 https://github.com/ruby-concurrency/concurrent-ruby/blob/f749b81cb6c629164 0c0004b57e60dbc2b59a72b/lib/concurrent-ruby/concurrent/collection/map/mri_ map_backend.rb#L22
#kaigionrails GraphQL Ruby をちょっとだけ速くした なおした 24 https://github.com/ruby-concurrency/concurrent-ruby/pull/879
#kaigionrails GraphQL Ruby をちょっとだけ速くした GraphQL Ruby Concurrent Ruby を ちょっとだけ速くした
@mtsmfm Fumiaki Matsushima Kaigi on Rails new #kaigionrails
#kaigionrails GraphQL Ruby をちょっとだけ速くした26 Warming up -------------------------------------- without patch 1.000
i/100ms with patch 1.000 i/100ms Calculating ------------------------------------- without patch 6.782 (± 0.0%) i/s - 34.000 in 5.030646s with patch 8.633 (±11.6%) i/s - 44.000 in 5.140707s Comparison: with patch: 8.6 i/s without patch: 6.8 i/s - 1.27x (± 0.00) slower 例のクエリが 1.27 倍速くなった
#kaigionrails GraphQL Ruby をちょっとだけ速くした27 ご清聴ありがとうございました - 配列を返す API で、子要素も配列になっていると要素数は M
* N になる (自明) - GraphQL Ruby は 20 * 50 要素 4 フィールドでも 66 ms くら い処理にかかる - Concurrent Ruby の master を使うと 54 ms くらいになる - Concurrent::Map#compute_if_absent で nil 返すのを3倍弱速くしたため - 他にも改善の余地はありそう - 簡易ベンチマークスクリプトを書いた - https://github.com/mtsmfm/graphql-ruby-benchmark-example