2009/3/17 Eleanor McHugh said:
spaces = /\s+/
chars = /[^A-Za-z0-9\s]/
This is generally less efficient and AFAIK there are no memory leaks
attached to this. It's a different story with varying regular
expressions (i.e. based on input or configuration). But in this case
I'd leave them in place.
Interesting, I'll have to do some tests to see what the difference is
in practice as this is a code pattern I use a lot.
It seems, the difference has decreased with 1.9, but you can at least
say that it's not slower to have a regular expression inline:
allruby rx.rb
ruby 1.8.5 (2006-08-25) [i386-linux]
Rehearsal -------------------------------------------------------
inline 15.300000 4.000000 19.300000 ( 19.354039)
separate 15.440000 3.940000 19.380000 ( 19.426682)
out of the loop 15.370000 4.000000 19.370000 ( 19.423543)
--------------------------------------------- total: 58.050000sec
user system total real
inline 15.330000 3.990000 19.320000 ( 19.341197)
separate 15.400000 3.980000 19.380000 ( 19.426264)
out of the loop 15.410000 3.950000 19.360000 ( 19.426081)
ruby 1.9.1p0 (2009-01-30 revision 21907) [i686-linux]
Rehearsal -------------------------------------------------------
inline 4.470000 0.000000 4.470000 ( 4.502066)
separate 4.450000 0.000000 4.450000 ( 4.466547)
out of the loop 4.460000 0.000000 4.460000 ( 4.473198)
--------------------------------------------- total: 13.380000sec
user system total real
inline 4.470000 0.000000 4.470000 ( 4.490634)
separate 4.470000 0.000000 4.470000 ( 4.480428)
out of the loop 4.450000 0.000000 4.450000 ( 4.506627)
[robert@ora01 ~]$ cat rx.rb
require 'benchmark'
REP = 10_000
text = ("foo bar baz " * 1_000).freeze
Benchmark.bmbm 20 do |bm|
bm.report "inline" do
REP.times do
text.scan(/bar/) do |match|
match.length
end
end
end
bm.report "separate" do
REP.times do
rx = /bar/
text.scan(rx) do |match|
match.length
end
end
end
bm.report "out of the loop" do
rx = /bar/
REP.times do
text.scan(rx) do |match|
match.length
end
end
end
end
[robert@ora01 ~]$
Cheers
robert