Robert Klemme wrote:
> 2008/3/6, Joel VanderWerf <vjoel / path.berkeley.edu>:
>>
>>  It's only about a factor of two faster, according to the following, but
>>  that matters sometimes.
> 
> 
>>  Rehearsal ---------------------------------------------------
>>  s.gsub(re){...}   5.970000   0.000000   5.970000 (  6.009089)
>>  s.gsub(re,...)    2.900000   0.060000   2.960000 (  3.148006)
>>  ------------------------------------------ total: 8.930000sec
>>
>>                        user     system      total        real
>>  s.gsub(re){...}   5.760000   0.010000   5.770000 (  5.925049)
>>  s.gsub(re,...)    2.800000   0.060000   2.860000 (  2.914432)
> 
> What version did you test with? I get much more dramatic differences:
> 
> 15:56:11 ~
> $ ruby /c/Temp/gs.rb
> Rehearsal -----------------------------------------------------------
> s.gsub(re){|x| x * 2}    25.313000   0.031000  25.344000 ( 25.354000)
> s.gsub(re){|x| x << x}   22.812000   0.000000  22.812000 ( 22.845000)
> s.gsub(re, '\1\1')        6.516000   0.015000   6.531000 (  6.539000)
> s.gsub(re, '\&\&')        6.578000   0.016000   6.594000 (  6.595000)
> s.gsub(/./){|x| x * 2}   25.172000   0.016000  25.188000 ( 25.182000)
> s.gsub(/./){|x| x << x}  22.843000   0.000000  22.843000 ( 22.857000)
> s.gsub(/(.)/, '\1\1')     6.344000   0.015000   6.359000 (  6.355000)
> s.gsub(/./, '\&\&')       6.188000   0.032000   6.220000 (  6.217000)
> ------------------------------------------------ total: 121.891000sec
> 
>                               user     system      total        real
> s.gsub(re){|x| x * 2}    25.484000   0.015000  25.499000 ( 25.502000)
> s.gsub(re){|x| x << x}   22.813000   0.031000  22.844000 ( 22.856000)
> s.gsub(re, '\1\1')        6.312000   0.000000   6.312000 (  6.337000)
> s.gsub(re, '\&\&')        6.359000   0.000000   6.359000 (  6.359000)
> s.gsub(/./){|x| x * 2}   25.922000   0.000000  25.922000 ( 25.994000)
> s.gsub(/./){|x| x << x}  22.672000   0.015000  22.687000 ( 22.707000)
> s.gsub(/(.)/, '\1\1')     6.375000   0.016000   6.391000 (  6.389000)
> s.gsub(/./, '\&\&')       6.235000   0.000000   6.235000 (  6.239000)
> 16:00:22 ~
> $ ruby -v
> ruby 1.8.6 (2007-03-13 patchlevel 0) [i386-cygwin]
> 16:00:26 ~
> $ cat /c/Temp/gs.rb
> require 'benchmark'
> 
> s = ("abc" * 1_000_000).freeze
> re = /(.)/
> re2 = /./
> 
> Benchmark.bmbm do |b|
>   b.report("s.gsub(re){|x| x * 2}") do
>     s.gsub(re) { |x| x * 2 }
>   end
> 
>   b.report("s.gsub(re){|x| x << x}") do
>     s.gsub(re) { |x| x << x }
>   end
> 
>   b.report("s.gsub(re, '\\1\\1')") do
>     s.gsub(re, "\\1\\1")
>   end
> 
>   b.report("s.gsub(re, '\\&\\&')") do
>     s.gsub(re, "\\&\\&")
>   end
> 
> 
>   b.report("s.gsub(/./){|x| x * 2}") do
>     s.gsub(/./) { |x| x * 2 }
>   end
> 
>   b.report("s.gsub(/./){|x| x << x}") do
>     s.gsub(/./) { |x| x << x }
>   end
> 
>   b.report("s.gsub(/(.)/, '\\1\\1')") do
>     s.gsub(/(.)/, "\\1\\1")
>   end
> 
>   b.report("s.gsub(/./, '\\&\\&')") do
>     s.gsub(/./, "\\&\\&")
>   end
> end
> 16:00:31 ~
> $
> 


And taking your non-perl champion:

s.gsub(/(.)/, '\1\1')

(I refuse to consider any code that uses perl syntax), and pitting it 
against:

s = 'abc'
new_str = ""
s.each_byte do |byte|
  2.times do
    new_str << byte
  end
end


I get:

gsub:
t1 exec time(1,000,000 loops): 5.625847 total

each_byte:
t2 exec time(1,000,000 loops): 5.325978 total




-- 
Posted via http://www.ruby-forum.com/.