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
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
0
180
GraphQL Ruby benchmark
mtsmfm
1
720
タイムアウトにご用心 / Timeout might break application state
mtsmfm
6
2.4k
Build REST API with GraphQL Ruby
mtsmfm
0
270
GraphQL Ruby をちょっとだけ速くした / Make graphql-ruby faster a bit
mtsmfm
1
670
Gaming PC on GCP
mtsmfm
0
670
How to introduce GraphQL to an existing React-Redux application
mtsmfm
1
210
Canary release in StudySapuri
mtsmfm
0
2.9k
Analyze Rails CI
mtsmfm
2
790
Other Decks in Technology
See All in Technology
スクラムチームを立ち上げる〜チーム開発で得られたもの・得られなかったもの〜
ohnoeight
2
350
AWS Media Services 最新サービスアップデート 2024
eijikominami
0
190
スクラム成熟度セルフチェックツールを作って得た学びとその活用法
coincheck_recruit
1
140
【若手エンジニア応援LT会】ソフトウェアを学んできた私がインフラエンジニアを目指した理由
kazushi_ohata
0
150
エンジニア人生の拡張性を高める 「探索型キャリア設計」の提案
tenshoku_draft
1
120
AGIについてChatGPTに聞いてみた
blueb
0
130
Amazon CloudWatch Network Monitor のススメ
yuki_ink
1
200
OCI Network Firewall 概要
oracle4engineer
PRO
0
4.1k
Evangelismo técnico: ¿qué, cómo y por qué?
trishagee
0
360
AWS Lambda のトラブルシュートをしていて思うこと
kazzpapa3
2
170
100 名超が参加した日経グループ横断の競技型 AWS 学習イベント「Nikkei Group AWS GameDay」の紹介/mediajaws202411
nikkei_engineer_recruiting
1
170
テストコード品質を高めるためにMutation Testingライブラリ・Strykerを実戦導入してみた話
ysknsid25
7
2.6k
Featured
See All Featured
Understanding Cognitive Biases in Performance Measurement
bluesmoon
26
1.4k
How to Think Like a Performance Engineer
csswizardry
20
1.1k
For a Future-Friendly Web
brad_frost
175
9.4k
Learning to Love Humans: Emotional Interface Design
aarron
273
40k
Why You Should Never Use an ORM
jnunemaker
PRO
54
9.1k
YesSQL, Process and Tooling at Scale
rocio
169
14k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
16
2.1k
Visualization
eitanlees
145
15k
GraphQLとの向き合い方2022年版
quramy
43
13k
GitHub's CSS Performance
jonrohan
1030
460k
Imperfection Machines: The Place of Print at Facebook
scottboms
265
13k
Product Roadmaps are Hard
iamctodd
PRO
49
11k
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