Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Railsのrenderをちょっと速くしました

akatsukinewgrad
December 17, 2021
500

 Railsのrenderをちょっと速くしました

akatsukinewgrad

December 17, 2021
Tweet

Transcript

  1. Railsのrenderをちょっと 速くしました 株式会社アカツキ ちょう 1

  2. ちょう @AZQ1994 2019年に新卒入社・サーバーエンジニア 出身:中国・瀋陽市 主に新規開発+高速化 Ruby, Elixirなど League of Legendsを6000時間以上やっている

    2
  3. 流れ • RailsのMVC • Viewの仕組み • 問題点 • 新しく作った仕組み •

    ベンチマーク • Gem化 RailsのJSONレンダリングが遅い… それを改善するgemを作りました というお話 3
  4. Railsの設計・MVC •Webサーバー • Requestを受け取り、Responseを返す • HTML(ウェブページ) • JSON(ウェブAPI) •MVC ->

    Model, View, Controller • 今日はRailsのAPIサーバーのViewについて話す Request:   XXXのJSONが欲しい! Response:   いいよ { "json": "data" } 4
  5. RailsのActionViewは何をしているのか •テンプレートとデータを利用して、返したい内容を生成する •返したい内容:HTML, JSONなど •それぞれ用のhandlerが存在する → ActionViewの仕組み上でhandlerを選ぶ感じ •だが、元々はHTMLのために作られていた設計だから、 JSONにとって合理的ではないところが多い 5

  6. Jbuilder • Rails標準のJSON handler • いいところ • JSON生成用の便利メソッドがいっぱいある • partialが使える、DRYに書ける

    • よくないところ • DSLを使用 • パフォーマンスがよくない • オブジェクト生成が多い • テンプレートの検索・ロードが遅い 6
  7. 既存解決: jb •https://github.com/amatsuda/jb • partialのレンダリングを速くしている • DSLをやめ、通常ruby syntaxを 使用している •ActionViewに乗っているので、

    •解決されなていない問題が まだたくさんある... •自分で実装することにした 7
  8. SimpleJsonを設計する  ポイント • テンプレート検索の高速化&メモリに載せたい • Layoutは使われていないので、とりあえずいらない • DSLをなくしたい(素のrubyで書きたい) • partialを速くしたい

    • templateとpartialを区別したくない • partialの引数をわかるようにしたい • JSONのエンコーディングも速くしたい 8
  9. 設計 9

  10. テンプレートは lambda • メモリに載せたい • 引数を明示的に書くようにしたい Procオブジェクトが最適 テンプレートのパスを省略不可にした (名前とテンプレートが1対1) これで、検索をHashでできる

    10
  11. さらに、使いやすいように、いろいろ工夫 • 複数のテンプレートパスを設定できるように • テンプレートのキャッシュ設定 • Viewキャッシュのヘルパー • JSONのencoderをC実装のGemに置き換える •

    jbuilderからsimple_jsonに乗り換るためのモジュール • 2種類の出力を比較してくれる • 存在しないpartialはjbuilderを使用できる など このくらいあれば、Jbuilderはいらないじゃろ! 11
  12. benchmarkで比較 rails6.1 ruby2.7.4で比較 - Jbuilder - Jb - SimpleJson 同じ内容の1

    template + 10 partialで時 間計測 結果: jbuilderの20倍速い 12
  13. RubyGemsで公開しました! gem 'simple_json' で使えます! https://github.com/aktsk/simple_json • よかったら使ってみてください • PR大歓迎です! (星くださいw!)

    13