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
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Fumiaki MATSUSHIMA
September 13, 2023
Technology
1
1.3k
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
260
GraphQL Ruby benchmark
mtsmfm
1
880
タイムアウトにご用心 / Timeout might break application state
mtsmfm
6
2.7k
Build REST API with GraphQL Ruby
mtsmfm
0
380
GraphQL Ruby をちょっとだけ速くした / Make graphql-ruby faster a bit
mtsmfm
1
770
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 Technology
See All in Technology
「お金で解決」が全てではない!大規模WebアプリのCI高速化 #phperkaigi
stefafafan
0
100
銀行の内製開発にて2つのプロダクトを1つのチームでスクラムしてみてる話
koba1210
1
150
バクラク最古参プロダクトで重ねた技術投資を振り返る
ypresto
0
170
Scrumは歪む — 組織設計の原理原則
dashi
0
200
Lambda Web AdapterでLambdaをWEBフレームワーク利用する
sahou909
0
170
Windows ファイル共有(SMB)を再確認する
murachiakira
PRO
0
170
AI時代のSaaSとETL
shoe116
1
190
The_Evolution_of_Bits_AI_SRE.pdf
nulabinc
PRO
0
240
社内レビューは機能しているのか
matsuba
0
150
VLAモデル構築のための AIロボット向け模倣学習キット
kmatsuiugo
0
250
CyberAgentの生成AI戦略 〜変わるものと変わらないもの〜
katayan
0
270
わからなくて良いなら、わからなきゃだめなの?
kotaoue
1
370
Featured
See All Featured
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
360
30k
Money Talks: Using Revenue to Get Sh*t Done
nikkihalliwell
0
180
The Illustrated Children's Guide to Kubernetes
chrisshort
51
52k
Building Adaptive Systems
keathley
44
3k
It's Worth the Effort
3n
188
29k
Sam Torres - BigQuery for SEOs
techseoconnect
PRO
0
220
Ethics towards AI in product and experience design
skipperchong
2
230
Ecommerce SEO: The Keys for Success Now & Beyond - #SERPConf2024
aleyda
1
1.9k
Joys of Absence: A Defence of Solitary Play
codingconduct
1
310
WENDY [Excerpt]
tessaabrams
9
36k
Conquering PDFs: document understanding beyond plain text
inesmontani
PRO
4
2.5k
svc-hook: hooking system calls on ARM64 by binary rewriting
retrage
2
180
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