From: Charles Mills Date: 2005-02-16T11:39:58+09:00 Subject: Re: Curious regexp behavior Derek Lewis wrote: > On a whim, I just decided to try an experiment with regexps, to see how > they perform in two slightly different cases. I wanted to see how using > a single regexp object for many many evaluations performed compared to > using the regexp within the loop. > > The scripts I wrote searched through a words file that is 234937 lines > long. > > Here's the scripts I wrote, to clarify: > First one: > > total = 0 > File.open( 'words', 'r' ) { |file| > file.each_line { |line| > word = line.chomp > total +=1 if word =~ /[a-df-h][aeiou]{2}/ > } > } > puts total > > Second one: > > rexp = /[a-df-h][aeiou]{2}/ > total = 0 > File.open( 'words', 'r' ) { |file| > file.each_line { |line| > word = line.chomp > total +=1 if word =~ rexp > } > } > puts total > > > I expected the second one to be slightly faster, but was surprised to > see that it was actually slightly slower. I ran each one about 10-15 > times, and eyeballed an average. The results from each run after the > first were pretty consistant. > > It's just a curiosity, but does anyone know what might cause them to be > 'backwards' like that? :) > I'll wager a guess. In the first version Ruby knows that '/[a-df-h][aeiou]{2}/' is a regexp. In the second one Ruby doesn't know if 'rexp' is a variable or method, so it has to do 1 maybe 2 look ups on every interation before it dispatches String#=~. Also regexp's are immutable so Ruby doesn't allocate a new regexp on every interation and storing the regexp has no effect in that regard. -Charlie