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
Learning from performance improvements on Graph...
Search
Fumiaki MATSUSHIMA
September 13, 2023
Technology
1
1.1k
Learning from performance improvements on GraphQL Ruby
https://www.meetup.com/graphql-tokyo/events/295606838/
Meetup #21 Guest talk and lightning talks
Fumiaki MATSUSHIMA
September 13, 2023
Tweet
Share
More Decks by Fumiaki MATSUSHIMA
See All by Fumiaki MATSUSHIMA
Ruby で作る Ruby (物理)
mtsmfm
1
210
GraphQL Ruby benchmark
mtsmfm
1
820
タイムアウトにご用心 / Timeout might break application state
mtsmfm
6
2.5k
Build REST API with GraphQL Ruby
mtsmfm
0
320
GraphQL Ruby をちょっとだけ速くした / Make graphql-ruby faster a bit
mtsmfm
1
720
Gaming PC on GCP
mtsmfm
0
730
How to introduce GraphQL to an existing React-Redux application
mtsmfm
1
250
Canary release in StudySapuri
mtsmfm
0
3.1k
Analyze Rails CI
mtsmfm
2
870
Other Decks in Technology
See All in Technology
エンジニア採用から始まる技術広報と組織づくり/202506lt
nishiuma
8
1.6k
Introduction to Sansan Meishi Maker Development Engineer
sansan33
PRO
0
280
データ戦略部門 紹介資料
sansan33
PRO
1
3.2k
菸酒生在 LINE Taiwan 的後端雙刀流
line_developers_tw
PRO
0
140
Amplifyとゼロからはじめた AIコーディング 成果と展望
mkdev10
1
190
自分を理解するAI時代の準備 〜マイプロフィールMCPの実装〜
edo_m18
0
110
AIエージェントの継続的改善のためオブザーバビリティ
pharma_x_tech
6
1.1k
IIWレポートからみるID業界で話題のMCP
fujie
0
130
研究開発部メンバーの働き⽅ / Sansan R&D Profile
sansan33
PRO
3
17k
生成AIをテストプロセスに活用し"よう"としている話 #jasstnano
makky_tyuyan
0
150
OCI Oracle Database Services新機能アップデート(2025/03-2025/05)
oracle4engineer
PRO
1
140
ゆるSRE #11 LT
okaru
1
590
Featured
See All Featured
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
29
2.6k
Testing 201, or: Great Expectations
jmmastey
42
7.5k
Product Roadmaps are Hard
iamctodd
PRO
53
11k
A better future with KSS
kneath
239
17k
Designing for humans not robots
tammielis
253
25k
Mobile First: as difficult as doing things right
swwweet
223
9.6k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
26
2.8k
Building a Scalable Design System with Sketch
lauravandoore
462
33k
What’s in a name? Adding method to the madness
productmarketing
PRO
22
3.5k
BBQ
matthewcrist
89
9.7k
Gamification - CAS2011
davidbonilla
81
5.3k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
PRO
20
1.3k
Transcript
@mtsmfm Learning from performance improvements on GraphQL Ruby
Fumiaki Matsushima GitHub, Twitter @mtsmfm
https://www.meetup.com/ja-JP/GraphQL-Tokyo/
https://autify.com/
https://autify.com/careers
https://www.youtube.com/watch?v=dvip2PXi52Y&t=1875s
None
None
Summary of my last talk - GraphQL Ruby 2.0.13 (the
latest version at that time) is twice slower than 1.5.15
Since 2.0.13, there have been 17 releases! https://rubygems.org/gems/graphql/versions
Benchmark target type Article { field0: String! field1: String! ...
fieldN: String! } type Query { articles: [Article!]! } query { articles { field0, field1, ..., fieldN } }
Benchmark target type Article { field0: String! field1: String! ...
fieldN: String! } type Query { articles: [Article!]! } query { articles { field0, field1, ..., fieldN } } Num of articles = 1000 Num of fields = 100
Run benchmark on GitHub Actions https://github.com/mtsmfm/graphql-ruby-benchmark/pull/4
Run benchmark on GitHub Actions https://github.com/mtsmfm/graphql-ruby-benchmark/pull/4
Run benchmark on GitHub Actions https://github.com/mtsmfm/graphql-ruby-benchmark/pull/4
Benchmark env - GitHub Actions (ubuntu-latest) - Ruby 3.2.2 -
https://github.com/mtsmfm/graphql-ruby-benchmark
None
None
Many performance improvements https://github.com/rmosolgo/graphql-ruby/blob/904e8c595637450 40b6d05c5ecb22a73a320c7b5/CHANGELOG.md
None
None
PR #4399 https://github.com/rmosolgo/graphql-ruby/pull/4399
PR #4399 https://github.com/rmosolgo/graphql-ruby/pull/4399
PR #4399 https://github.com/rmosolgo/graphql-ruby/pull/4399
PR #4399 https://github.com/rmosolgo/graphql-ruby/pull/4399
PR #4399 1. Introduces CurrentState class to store runtime state
2. Removes unnecessary context lookup
PR #4399 1. Introduces CurrentState class to store runtime state
2. Removes unnecessary context lookup
Previous code
Previous code
PR #4399 https://github.com/rmosolgo/graphql-ruby/pull/4399
Referring context takes time?!
Context#[] https://github.com/rmosolgo/graphql-ruby/blob/904e8c59563745040b6d05c5ec b22a73a320c7b5/lib/graphql/query/context.rb#L124-L141
Context#[] https://github.com/rmosolgo/graphql-ruby/blob/904e8c59563745040b6d05c5ec b22a73a320c7b5/lib/graphql/query/context.rb#L124-L141 Hash like Hash Set
Looks fast enough 🤔
Benchmark target type Article { field0: String! field1: String! ...
fieldN: String! } type Query { articles: [Article!]! } query { articles { field0, field1, ..., fieldN } } Num of articles = 1000 Num of fields = 100
Benchmark target type Article { field0: String! field1: String! ...
fieldN: String! } type Query { articles: [Article!]! } query { articles { field0, field1, ..., fieldN } } Num of articles = 1000 Num of fields = 100 = 100,000 fields!
Learning from PR #4399 1. Field related code can be
a hotspot a. Even context lookup
Context#[] https://github.com/rmosolgo/graphql-ruby/blob/904e8c59563745040b6d05c5ec b22a73a320c7b5/lib/graphql/query/context.rb#L124-L141
It changes [key] to public_send(key) https://github.com/rmosolgo/graphql-ruby/pull/4399/files#diff-2c8869b38ea62e6 9d0aa4fc7e571e6dc3b8c9f05fba9c25bc79fc17cfee2a335
require 'bundler/inline' gemfile do source 'https://rubygems.org' gem 'benchmark-ips', require: 'benchmark/ips'
gem 'graphql' end state = GraphQL::Execution::Interpreter::Runtime::CurrentState.new Benchmark.ips do |x| x.report('send') do state.public_send(:current_arguments) end x.report('direct') do state.current_arguments end x.compare! end
public_send is 2 times slower $ ruby foo.rb Warming up
-------------------------------------- send 889.676k i/100ms direct 2.157M i/100ms Calculating ------------------------------------- send 8.757M (± 7.4%) i/s - 43.594M in 5.008124s direct 20.391M (± 7.0%) i/s - 103.546M in 5.105176s Comparison: direct: 20391490.9 i/s send: 8756908.0 i/s - 2.33x slower
2% improvements https://github.com/rmosolgo/graphql-ruby/pull/4631
Conclusion 1. GraphQL Ruby is twice faster than last year!
2. Consider total number of fields a. Especially if you’re going to add some codes which affect all fields 3. Enjoy Talk Driven Development