Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Railsのrenderをちょっと速くしました
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
akatsukinewgrad
December 17, 2021
1.3k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Railsのrenderをちょっと速くしました
akatsukinewgrad
December 17, 2021
More Decks by akatsukinewgrad
See All by akatsukinewgrad
2023/1/25_QAテスター meet up!
akatsukinewgrad
0
180
成果発表資料.pdf
akatsukinewgrad
0
2.3k
広大なフィールドを気持ちよく駆け抜けるための技術.pdf
akatsukinewgrad
0
700
正規表現とReDoS.pdf
akatsukinewgrad
0
680
Unityで大量のオブジェクト_を吹き飛ばしたい.pdf
akatsukinewgrad
0
730
新卒2年目が思う1年目の学び.pdf
akatsukinewgrad
0
660
障害訓練の取り組みについて.pdf
akatsukinewgrad
0
830
7分でわかるアカツキゲームス
akatsukinewgrad
0
680
Bitcoinだけでスマートコントラクト.pdf
akatsukinewgrad
1
1.2k
Featured
See All Featured
How to optimise 3,500 product descriptions for ecommerce in one day using ChatGPT
katarinadahlin
PRO
3
3.9k
Claude Code どこまでも/ Claude Code Everywhere
nwiizo
68
58k
Efficient Content Optimization with Google Search Console & Apps Script
katarinadahlin
PRO
1
920
Reality Check: Gamification 10 Years Later
codingconduct
0
2.3k
Test your architecture with Archunit
thirion
2
2.4k
Product Roadmaps are Hard
iamctodd
55
13k
The browser strikes back
jonoalderson
0
1.8k
Hiding What from Whom? A Critical Review of the History of Programming languages for Music
tomoyanonymous
3
1.3k
A better future with KSS
kneath
240
18k
Being A Developer After 40
akosma
92
590k
Technical Leadership for Architectural Decision Making
baasie
3
600
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.7k
Transcript
Railsのrenderをちょっと 速くしました 株式会社アカツキ ちょう 1
ちょう @AZQ1994 2019年に新卒入社・サーバーエンジニア 出身:中国・瀋陽市 主に新規開発+高速化 Ruby, Elixirなど League of Legendsを6000時間以上やっている
2
流れ • RailsのMVC • Viewの仕組み • 問題点 • 新しく作った仕組み •
ベンチマーク • Gem化 RailsのJSONレンダリングが遅い… それを改善するgemを作りました というお話 3
Railsの設計・MVC •Webサーバー • Requestを受け取り、Responseを返す • HTML(ウェブページ) • JSON(ウェブAPI) •MVC ->
Model, View, Controller • 今日はRailsのAPIサーバーのViewについて話す Request: XXXのJSONが欲しい! Response: いいよ { "json": "data" } 4
RailsのActionViewは何をしているのか •テンプレートとデータを利用して、返したい内容を生成する •返したい内容:HTML, JSONなど •それぞれ用のhandlerが存在する → ActionViewの仕組み上でhandlerを選ぶ感じ •だが、元々はHTMLのために作られていた設計だから、 JSONにとって合理的ではないところが多い 5
Jbuilder • Rails標準のJSON handler • いいところ • JSON生成用の便利メソッドがいっぱいある • partialが使える、DRYに書ける
• よくないところ • DSLを使用 • パフォーマンスがよくない • オブジェクト生成が多い • テンプレートの検索・ロードが遅い 6
既存解決: jb •https://github.com/amatsuda/jb • partialのレンダリングを速くしている • DSLをやめ、通常ruby syntaxを 使用している •ActionViewに乗っているので、
•解決されなていない問題が まだたくさんある... •自分で実装することにした 7
SimpleJsonを設計する ポイント • テンプレート検索の高速化&メモリに載せたい • Layoutは使われていないので、とりあえずいらない • DSLをなくしたい(素のrubyで書きたい) • partialを速くしたい
• templateとpartialを区別したくない • partialの引数をわかるようにしたい • JSONのエンコーディングも速くしたい 8
設計 9
テンプレートは lambda • メモリに載せたい • 引数を明示的に書くようにしたい Procオブジェクトが最適 テンプレートのパスを省略不可にした (名前とテンプレートが1対1) これで、検索をHashでできる
10
さらに、使いやすいように、いろいろ工夫 • 複数のテンプレートパスを設定できるように • テンプレートのキャッシュ設定 • Viewキャッシュのヘルパー • JSONのencoderをC実装のGemに置き換える •
jbuilderからsimple_jsonに乗り換るためのモジュール • 2種類の出力を比較してくれる • 存在しないpartialはjbuilderを使用できる など このくらいあれば、Jbuilderはいらないじゃろ! 11
benchmarkで比較 rails6.1 ruby2.7.4で比較 - Jbuilder - Jb - SimpleJson 同じ内容の1
template + 10 partialで時 間計測 結果: jbuilderの20倍速い 12
RubyGemsで公開しました! gem 'simple_json' で使えます! https://github.com/aktsk/simple_json • よかったら使ってみてください • PR大歓迎です! (星くださいw!)
13