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

たった50行直しただけでCSV一括登録機能が2h速くなった話/gotandarb-54-link-and-motivation

 たった50行直しただけでCSV一括登録機能が2h速くなった話/gotandarb-54-link-and-motivation

【Gotanda.rb#54】
リンクアンドモチベーション登壇資料(2023/08/24)

『たった50行直しただけでCSV一括登録機能が2h速くなった話』

#gotandarb #リンクアンドモチベーション #リンモチ
=============================================
【イベント情報】
■イベントページ
 https://gotanda-rb.connpass.com/event/291206/

【株式会社リンクアンドモチベーション】
■お問い合わせ
 [email protected]
■Entrancebook
 https://note.com/lmi/n/n179505e048f4
■テックブログ
 https://link-and-motivation.hatenablog.com/
=============================================

More Decks by リンクアンドモチベーション

Transcript

  1. 2 © Link and Motivation Group 谷 有輝(@taniiiiim) 株式会社リンクアンドモチベーション Developer

    Productivityユニット プラットフォーム推進グループ • 2019年新卒入社 • バックエンドメインのフルスタックエンジニア • モチベーションクラウドシリーズ内外のシステム 連携開発に従事 • 趣味はパルクール🏃‍ ♂️ 自己紹介
  2. 4 © Link and Motivation Group Ruby on Railsでの開発中に遭遇した性能問題の事例共有 実際にパフォーマンス問題を解消した方法の事例共有

    ※本発表で共有する機能・コードは実際のものとは異なります。 ※本発表で共有する解消方法が全てではございません。あくまで一例としてご参考いただけたらと思います。 今日お話しする内容
  3. 5 © Link and Motivation Group Ruby on Railsでの開発中に遭遇した性能問題の事例共有 実際にパフォーマンス問題を解消した方法の事例共有

    ※本発表で共有する機能・コードは実際のものとは異なります。 ※本発表で共有する解消方法が全てではございません。あくまで一例としてご参考いただけたらと思います。 今日お話しする内容 基本的なことをちょっと意識するだけで パフォーマンス改善できる!
  4. 9 © Link and Motivation Group 登録CSVファイル 名前 性別 年齢

    役職 持部 太郎 男性 35歳 課長 輪怐 次郎 男性 40歳 部長 紫苑 花子 女性 30歳 係長 ユーザーをラベルつきで登録
  5. 11 © Link and Motivation Group 目標 1h 結果 3h15min

    実施した性能試験 ユーザー50000人×ラベル10000件で性能試験
  6. 18 © Link and Motivation Group ①不要にループをしている # Before labels.map

    do |label| users.find do |user| label.user == user end end ループ数 実装詳細 Before (label数) * (user数) labelとuserの二重ループ
  7. 19 © Link and Motivation Group ①不要にループをしている # Before labels.map

    do |label| users.find do |user| label.user == user end end # After labels.map do |label| label.user end ループ数 実装詳細 Before (label数) * (user数) labelとlabelの二重ループ After (label数) labelのループのみ
  8. 20 © Link and Motivation Group ①不要にループをしている # Before user_label

    = user_labels.find do |user_label| labels.include?(user_label.label) end # After label = labels.find do |label| user_label_by_label_id[label.id] end user_label = user_label_by_label_id[label.id] ループ数 実装詳細 Before (label数)^2 * (user 数) user_labelとlabelの二重ループ After (label数) labelのループ ループ数が大幅に減って性能改善 before: 500000000回 after: 10000回
  9. 21 © Link and Motivation Group # Before name =

    "持部 太郎" users = User.all user_by_name = users.index_by(&:name) user_id = user_by_name[name].id ②不要に大きなインスタンス生成をしている users user_by_name Before ActiveRecord::Relation valueがActiveRecordのHash
  10. 22 © Link and Motivation Group # Before name =

    "持部 太郎" users = User.all user_by_name = users.index_by(&:name) user_id = user_by_name[name].id ②不要に大きなインスタンス生成をしている users user_by_name Before ActiveRecord::Relation valueがActiveRecordのHash 不必要にActiveRecord::Relation の インスタンスを生成すると 無駄な処理コストがかかる
  11. 23 © Link and Motivation Group # Before name =

    "持部 太郎" users = User.all user_by_name = users.index_by(&:name) user_id = user_by_name[name].id ②不要に大きなインスタンス生成をしている # After name = "持部 太郎" users = User.all.pluck(:id, :name) user_by_name = users.index_by(&:name) user_id = user_by_name[name][0] users user_by_name Before ActiveRecord::Relation valueがActiveRecordのHash After Array valueがArrayのHash
  12. 24 © Link and Motivation Group # Before name =

    "持部 太郎" users = User.all user_by_name = users.index_by(&:name) user_id = user_by_name[name].id ②不要に大きなインスタンス生成をしている # After name = "持部 太郎" users = User.all.pluck(:id, :name) user_by_name = users.index_by(&:name) user_id = user_by_name[name][0] users user_by_name Before ActiveRecord::Relation valueがActiveRecordのHash After Array valueがArrayのHash 生成されるインスタンスが小さくなり 処理コストが削減
  13. 27 © Link and Motivation Group 明日からでもできる性能改善4選 1. 二重ループを見たら、一個でも減らす 2.

    「集合に含まれているか?」の判定にSet#includeを使う 3. ActiveRecord(::Relation)のインスタンスではなく必要なカラムの値のみを利用し て変数に格納する 4. 必要なカラムだけselectする 総括 基本的なことをちょっと意識するだけで パフォーマンス改善できる!
  14. 28 © Link and Motivation Group お知らせ • エンジニアリングマネージャー •

    プロダクトマネージャー • テックリード • サーバーサイドエンジニア • フロントエンドエンジニア • SRE • データエンジニア • CRM • UXデザイナー 週1でテックブログ更新しています! まずはカジュアルにお話しましょう! ご連絡お待ちしております! 全職種、積極採用中です!