読者です 読者をやめる 読者になる 読者になる

GCを止めてrspecを高速化する

https://makandracards.com/makandra/950-speed-up-rspec-by-deferring-garbage-collection

GCを止めてrspecを高速化しようという話。
やり方は簡単で上記のリンクにあるコードをspec/support以下にでもおいて、spec_helper.rbにbefore(:all)とafter(:all)を書き足せばいいだけ。
上記のコードだとデフォルトで10秒間に1回だけ行うようになってるがENVで秒数は指定できる。
文中には15%の高速化とあるけど、手元のコードもだいたいそれくらい速くなった。

ただ実際に動かすとわかるけど、メモリをめっちゃ食う。
手元の環境(iMac 21.5-inch, Mid 2011 メモリ8GB)だとrspec自体は2〜3分で、メモリは残り100MBくらいまでになる

https://github.com/diaspora/diaspora/blob/master/spec/support/deferred_garbage_collection.rb

def self.memory_threshold
  @mem = %x(free 2>/dev/null).to_s.split(" ")
  return nil if @mem.empty?
  @mem[15].to_i / (@mem[7].to_i/100)
end 

ちょっと前に話題になったdiasporaだと上のようにしてメモリ使用量を取得して、メモリが90%以上になったらGC.startしてるけど、Macだとfreeコマンドが使えないからうまくいかない。
他にもググるとexampleを実行した回数がn回になるまでGCを止めるという方法が出てくるけどどうなんだろう?
全体のテストはリモートのLinuxマシンでやらせればいいという話もあるんだけど、どうにかしてうまくできないもんかなー。