From: Alexander Dymo Date: 2008-02-02T01:59:49+09:00 Subject: [PATCH] make Benchmark#realtime a bit faster --Boundary-00=_kB1oHIcIN0Lbu2c Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline Hi, This little patch (against 1.8 branch) makes Benchmark#realtime a bit faster by directly evaluating elapsed real time instead of using Benchmark#measure. The problem is Rails uses Benchmark#realtime a lot and it's not uncommon to see it called several thousand times during a single request. Existing function calls malloc 29 times and allocates at least 1.5K memory (that number can be more probably depending on the context where the block is defined, but I'm just guessing here). Patched function allocates 250b with 7 mallocs. In any case, once you repeat #realtime several thouthand times, you get a good chance of eating too much memory and triggering GC which slows down the whole thing (this and other cases are described in http://blog.pluron.com/2008/01/ruby-on-rails-i.html ). -- Alex --Boundary-00=_kB1oHIcIN0Lbu2c Content-Type: text/x-diff; charset="us-ascii"; name="benchmark_realtime.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="benchmark_realtime.patch" Index: lib/benchmark.rb =================================================================== --- lib/benchmark.rb (revision 15364) +++ lib/benchmark.rb (working copy) @@ -304,7 +304,10 @@ # Returns the elapsed real time used to execute the given block. # def realtime(&blk) # :yield: - Benchmark::measure(&blk).real + r0 = Time.now + yield + r1 = Time.now + r1.to_f - r0.to_f end --Boundary-00=_kB1oHIcIN0Lbu2c--