Railsアプリの開発環境を速くするための調査 その1 - gemの読み込み時間

その1って書いたけど、続くかは不明。

今回は使っているgemの読み込み時間を測ってみた。

Benchmark を仕込む

config/application.rb でgemを読み込む前に Kernel.require を上書きして、計測する。

+require 'benchmark'
+$result = {}
+Kernel.singleton_class.prepend(Module.new do
+  def require(feature)
+    ret = nil
+    $result[feature] = Benchmark.realtime { ret = super }
+    ret
+  end
+end)
 Bundler.require(*Rails.groups)
+$result.sort_by { |_, t| -t }.take(20)
+  .each { |feature, time| puts "#{format("%0.3f", time)}: #{feature}" }

実際に測ってみる

tootsuite/mastodon で試してみた。

$ bin/rails runner nil
0.486: chewy
0.228: pry-byebug
0.167: charlock_holmes
0.161: fog/core
0.110: fuubar
0.105: devise-two-factor
0.101: json/ld/preloaded
0.098: omniauth-saml
0.085: goldfinger
0.077: json/ld
0.064: hamlit-rails
0.064: paperclip
0.058: health_check
0.050: fabrication
0.049: twitter-text
0.046: rqrcode
0.042: parslet
0.039: annotate
0.035: pghero
0.034: iso-639

こんな感じで読み込みに時間がかかっているgemが分かる。