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
Railsのrenderをちょっと速くしました
Search
akatsukinewgrad
December 17, 2021
0
940
Railsのrenderをちょっと速くしました
akatsukinewgrad
December 17, 2021
Tweet
Share
More Decks by akatsukinewgrad
See All by akatsukinewgrad
2023/1/25_QAテスター meet up!
akatsukinewgrad
0
100
成果発表資料.pdf
akatsukinewgrad
0
1.8k
広大なフィールドを気持ちよく駆け抜けるための技術.pdf
akatsukinewgrad
0
450
正規表現とReDoS.pdf
akatsukinewgrad
0
460
Unityで大量のオブジェクト_を吹き飛ばしたい.pdf
akatsukinewgrad
0
470
新卒2年目が思う1年目の学び.pdf
akatsukinewgrad
0
430
障害訓練の取り組みについて.pdf
akatsukinewgrad
0
540
7分でわかるアカツキゲームス
akatsukinewgrad
0
470
Bitcoinだけでスマートコントラクト.pdf
akatsukinewgrad
1
740
Featured
See All Featured
Fontdeck: Realign not Redesign
paulrobertlloyd
81
5.2k
Building Applications with DynamoDB
mza
90
6.1k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
107
49k
The Cost Of JavaScript in 2023
addyosmani
45
6.6k
Learning to Love Humans: Emotional Interface Design
aarron
272
40k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
27
790
What's new in Ruby 2.0
geeforr
342
31k
Rails Girls Zürich Keynote
gr2m
93
13k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
191
16k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
46
2.1k
How To Stay Up To Date on Web Technology
chriscoyier
788
250k
The Straight Up "How To Draw Better" Workshop
denniskardys
232
140k
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