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
990
Railsのrenderをちょっと速くしました
akatsukinewgrad
December 17, 2021
Tweet
Share
More Decks by akatsukinewgrad
See All by akatsukinewgrad
2023/1/25_QAテスター meet up!
akatsukinewgrad
0
110
成果発表資料.pdf
akatsukinewgrad
0
1.9k
広大なフィールドを気持ちよく駆け抜けるための技術.pdf
akatsukinewgrad
0
500
正規表現とReDoS.pdf
akatsukinewgrad
0
490
Unityで大量のオブジェクト_を吹き飛ばしたい.pdf
akatsukinewgrad
0
520
新卒2年目が思う1年目の学び.pdf
akatsukinewgrad
0
470
障害訓練の取り組みについて.pdf
akatsukinewgrad
0
620
7分でわかるアカツキゲームス
akatsukinewgrad
0
510
Bitcoinだけでスマートコントラクト.pdf
akatsukinewgrad
1
790
Featured
See All Featured
Large-scale JavaScript Application Architecture
addyosmani
511
110k
Become a Pro
speakerdeck
PRO
26
5.1k
RailsConf 2023
tenderlove
29
1k
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
Unsuck your backbone
ammeep
669
57k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
6
550
How STYLIGHT went responsive
nonsquared
98
5.4k
Code Review Best Practice
trishagee
67
18k
The Power of CSS Pseudo Elements
geoffreycrofte
75
5.5k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
114
50k
How to Think Like a Performance Engineer
csswizardry
22
1.3k
Building Adaptive Systems
keathley
40
2.4k
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