From: Tim Greer Date: 2009-01-11T09:19:34+09:00 Subject: Re: Q: most efficient way to remove duplicate spaces in a string? pat eyler wrote: > On Sat, Jan 10, 2009 at 1:14 PM, Tim Greer wrote: >> For gsub/gsub!, instead of replacing one or more white space with a >> white space, speed it up by replacing two or more white space with a >> white space. This saves unneeded processing by not replacing single >> white space. I.e., instead of gsub(/ +/, ' '), try gsub(/ +/, ' ') >> or >> gsub(/ {2,}/, ' ') and benchmark them (they should be faster). Of >> course, it's still not going to be as fast as split.join or >> squeeze.strip (at least depending on the version of ruby used, as >> older ruby versions may put squeeze.strip markedly slower than >> split.join. > > #!/usr/bin/ruby > > require 'benchmark' > > n = 1_000_000 > > Benchmark.bm(15) do |x| > x.report("gsub") { n.times do > a_string = "This is a test string." > a_string.gsub(/ +/, ' ') > end > } > x.report("gsub!") { n.times do > a_string = "This is a test string." > a_string.gsub!(/ +/, ' ') > end > } > x.report("gsub2") { n.times do > a_string = "This is a test string." > a_string.gsub(/ {2,}/, ' ') > end > } > x.report("gsub!2") { n.times do > a_string = "This is a test string." > a_string.gsub!(/ {2,}/, ' ') > end > } > x.report("gsub s") { n.times do > a_string = "This is a test string." > a_string.gsub(/\s+/, ' ') > end > } > x.report("gsub! s") { n.times do > a_string = "This is a test string." > a_string.gsub!(/\s+/, ' ') > end > } > x.report("gsub2 s") { n.times do > a_string = "This is a test string." > a_string.gsub(/\s{2,}/, ' ') > end > } > x.report("gsub!2 s") { n.times do > a_string = "This is a test string." > a_string.gsub!(/\s{2,}/, ' ') > end > } > x.report("split.join") { n.times do > a_string = "This is a test string." > a_string.split.join(' ') > end > } > x.report("squeeze.strip") { n.times do > a_string = "This is a test string." > a_string.squeeze(' ').strip > end > } > end > > > $ ./stringcleanup.rb > user system total real > gsub 7.250000 0.120000 7.370000 ( 8.386002) > gsub! 7.240000 0.130000 7.370000 ( 9.007479) > gsub2 7.110000 0.140000 7.250000 ( 9.302915) > gsub!2 6.830000 0.150000 6.980000 ( 9.309362) > gsub s 7.410000 0.140000 7.550000 ( 10.864572) > gsub! s 7.400000 0.130000 7.530000 ( 10.286886) > gsub2 s 7.020000 0.100000 7.120000 ( 8.977424) > gsub!2 s 6.860000 0.100000 6.960000 ( 8.421220) > split.join 4.420000 0.110000 4.530000 ( 5.716684) > squeeze.strip 3.120000 0.110000 3.230000 ( 3.651918) > > > I haven't run it enough to do any statistical analysis, but after > 5 runs it seems like the various flavors of gsub/gsub! don't really > perform any differently. splitting and squeezing look like much > better options. > > > Yeah, it doesn't make a huge difference, but it's just a little faster is all. Definitely split.join is faster. squeeze.strip is the fastest (though that will actually take longer on older versions of ruby). My follow up was really just a reference for gsub/gsub!, not that it would be faster than the other two. :-) -- Tim Greer, CEO/Founder/CTO, BurlyHost.com, Inc. Shared Hosting, Reseller Hosting, Dedicated & Semi-Dedicated servers and Custom Hosting. 24/7 support, 30 day guarantee, secure servers. Industry's most experienced staff! -- Web Hosting With Muscle!