Tech Hotoke Blog

IT観音とは私のことです。

チリも積もれば山となる。パフォーマンスを測定してわかったリファクタリングの効果 #Ruby #Rails

これは何?

コードのリファクタリングの際に、パフォーマンスの計測まで行ってみたら結構な差が出てきたので、メモ。

前提

Tips

  • mapを使っていた箇所をpluckを使ってリファクタリングしてみた
    • before

      user_ids =Pls.where(pl_id: pl.id).map { |record| record['user_id'] }

    • after

      user_ids =Pls.where(pl_id: pl.id).pluck(:user_id)

結果

  • 出力されるSQLはSELECT句で全レコードを取得するか、特定のレコードを取得するかの差がある。
  • この差 + map処理が省略される差で処理速度がpluckの方が向上する場合が多い。

  • pluckを使った場合

SELECT `pl`.`user_id` FROM `pls` WHERE `pls`.`pl_id` = 3
  • mapを使った場合
SELECT `pl`.* FROM `pls` WHERE `pls`.`pl_id` = 3
  • パフォーマンスの比較をすると、 78倍 もの差があった。
  • もともと処理の時間が短いものの、こういうのがちりつもになって、パフォーマンスの劣化を招いていくのだろう。。。
  • 対象のテーブルのカラム数は10程度なので、これが増えていくとさらに差が出てくると思われる。
Before Refactoring: 0.93471800000043 seconds
After Refactoring: 0.01190639999913401 seconds