$30 off During Our Annual Pro Sale. View Details »
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Railsのrenderをちょっと速くしました
Search
akatsukinewgrad
December 17, 2021
0
1.2k
Railsのrenderをちょっと速くしました
akatsukinewgrad
December 17, 2021
Tweet
Share
More Decks by akatsukinewgrad
See All by akatsukinewgrad
2023/1/25_QAテスター meet up!
akatsukinewgrad
0
150
成果発表資料.pdf
akatsukinewgrad
0
2.1k
広大なフィールドを気持ちよく駆け抜けるための技術.pdf
akatsukinewgrad
0
610
正規表現とReDoS.pdf
akatsukinewgrad
0
590
Unityで大量のオブジェクト_を吹き飛ばしたい.pdf
akatsukinewgrad
0
650
新卒2年目が思う1年目の学び.pdf
akatsukinewgrad
0
560
障害訓練の取り組みについて.pdf
akatsukinewgrad
0
740
7分でわかるアカツキゲームス
akatsukinewgrad
0
600
Bitcoinだけでスマートコントラクト.pdf
akatsukinewgrad
1
1k
Featured
See All Featured
Pawsitive SEO: Lessons from My Dog (and Many Mistakes) on Thriving as a Consultant in the Age of AI
davidcarrasco
0
35
The Curious Case for Waylosing
cassininazir
0
190
Public Speaking Without Barfing On Your Shoes - THAT 2023
reverentgeek
1
280
[RailsConf 2023] Rails as a piece of cake
palkan
58
6.2k
Joys of Absence: A Defence of Solitary Play
codingconduct
1
260
How Software Deployment tools have changed in the past 20 years
geshan
0
30k
The Pragmatic Product Professional
lauravandoore
37
7.1k
Digital Ethics as a Driver of Design Innovation
axbom
PRO
0
130
We Are The Robots
honzajavorek
0
120
Believing is Seeing
oripsolob
0
15
SERP Conf. Vienna - Web Accessibility: Optimizing for Inclusivity and SEO
sarafernandez
1
1.3k
Discover your Explorer Soul
emna__ayadi
2
1k
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