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

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

akatsukinewgrad
December 17, 2021
770

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

akatsukinewgrad

December 17, 2021
Tweet

Transcript

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

    View full-size slide

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

    View full-size slide

  3. 流れ
    • RailsのMVC
    • Viewの仕組み
    • 問題点
    • 新しく作った仕組み
    • ベンチマーク
    • Gem化
    RailsのJSONレンダリングが遅い…
    それを改善するgemを作りました
    というお話
    3

    View full-size slide

  4. Railsの設計・MVC
    •Webサーバー
    • Requestを受け取り、Responseを返す
    • HTML(ウェブページ)
    • JSON(ウェブAPI)
    •MVC -> Model, View, Controller
    • 今日はRailsのAPIサーバーのViewについて話す
    Request:
      XXXのJSONが欲しい!
    Response:
      いいよ { "json": "data" }
    4

    View full-size slide

  5. RailsのActionViewは何をしているのか
    •テンプレートとデータを利用して、返したい内容を生成する
    •返したい内容:HTML, JSONなど
    •それぞれ用のhandlerが存在する
    → ActionViewの仕組み上でhandlerを選ぶ感じ
    •だが、元々はHTMLのために作られていた設計だから、
    JSONにとって合理的ではないところが多い
    5

    View full-size slide

  6. Jbuilder
    • Rails標準のJSON handler
    • いいところ
    • JSON生成用の便利メソッドがいっぱいある
    • partialが使える、DRYに書ける
    • よくないところ
    • DSLを使用
    • パフォーマンスがよくない
    • オブジェクト生成が多い
    • テンプレートの検索・ロードが遅い
    6

    View full-size slide

  7. 既存解決: jb
    •https://github.com/amatsuda/jb
    • partialのレンダリングを速くしている
    • DSLをやめ、通常ruby syntaxを
    使用している
    •ActionViewに乗っているので、
    •解決されなていない問題が
    まだたくさんある...
    •自分で実装することにした
    7

    View full-size slide

  8. SimpleJsonを設計する
     ポイント
    • テンプレート検索の高速化&メモリに載せたい
    • Layoutは使われていないので、とりあえずいらない
    • DSLをなくしたい(素のrubyで書きたい)
    • partialを速くしたい
    • templateとpartialを区別したくない
    • partialの引数をわかるようにしたい
    • JSONのエンコーディングも速くしたい
    8

    View full-size slide

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

    View full-size slide

  10. さらに、使いやすいように、いろいろ工夫
    • 複数のテンプレートパスを設定できるように
    • テンプレートのキャッシュ設定
    • Viewキャッシュのヘルパー
    • JSONのencoderをC実装のGemに置き換える
    • jbuilderからsimple_jsonに乗り換るためのモジュール
    • 2種類の出力を比較してくれる
    • 存在しないpartialはjbuilderを使用できる
    など
    このくらいあれば、Jbuilderはいらないじゃろ!
    11

    View full-size slide

  11. benchmarkで比較
    rails6.1 ruby2.7.4で比較
    - Jbuilder
    - Jb
    - SimpleJson
    同じ内容の1 template + 10 partialで時
    間計測
    結果:
    jbuilderの20倍速い
    12

    View full-size slide

  12. RubyGemsで公開しました!
    gem 'simple_json' で使えます!
    https://github.com/aktsk/simple_json
    • よかったら使ってみてください
    • PR大歓迎です!
    (星くださいw!)
    13

    View full-size slide