Nikolai Weibull wrote:
* Daniel Amelang (Mar 19, 2005 23:30):
> Perhaps a more interesting solution would be to get rid of all
> destructive methods and work on optimizing ther existing
> non-destructive counterparts. Matz seems to prefer this solution.
> http://ruby-talk.org/cgi-bin/scat.rb/ruby/ruby-talk/17764
> Unfortunately, the non-destructive versions are still quite
noticeably
> slower.
No they're not. Where are you getting these assertions from?,
nikolai
Oh, I dunno. Maybe this benchmark?
The only exception was slice vs. slice!. No idea what happened there.
Here are the results of my benchmark running on a 1.8 GHz P4, 512MB
RAM, on Windows XP, SP2. The actual benchmark code I used it further
below.
C:\eclipse\workspace\ruby-foo\benchmarks>ruby bang.rb
user system total real
capitalize 1.862000 0.000000 1.862000 ( 1.923000)
capitalize! 0.591000 0.000000 0.591000 ( 0.600000)
chomp 1.663000 0.010000 1.673000 ( 1.853000)
chomp! 0.510000 0.000000 0.510000 ( 0.511000)
delete 5.739000 0.030000 5.769000 ( 6.449000)
delete! 4.396000 0.000000 4.396000 ( 4.606000)
downcase 1.712000 0.010000 1.722000 ( 2.294000)
downcase! 0.581000 0.000000 0.581000 ( 0.580000)
gsub 4.296000 0.030000 4.326000 ( 5.188000)
gsub! 0.972000 0.000000 0.972000 ( 1.161000)
lstrip 1.762000 0.020000 1.782000 ( 2.123000)
lstrip! 0.431000 0.000000 0.431000 ( 0.431000)
next 1.813000 0.000000 1.813000 ( 1.933000)
next! 1.331000 0.010000 1.341000 ( 1.472000)
reverse 1.633000 0.010000 1.643000 ( 1.742000)
reverse! 0.380000 0.000000 0.380000 ( 0.501000)
rstrip 1.773000 0.000000 1.773000 ( 1.882000)
rstrip! 0.420000 0.000000 0.420000 ( 0.431000)
slice 1.883000 0.020000 1.903000 ( 2.454000)
slice! 3.415000 0.010000 3.425000 ( 3.765000)
strip 1.793000 0.000000 1.793000 ( 1.812000)
strip! 0.370000 0.000000 0.370000 ( 0.411000)
sub 1.302000 0.000000 1.302000 ( 1.382000)
sub! 0.901000 0.000000 0.901000 ( 1.202000)
swapcase 0.862000 0.000000 0.862000 ( 0.961000)
swapcase! 0.420000 0.000000 0.420000 ( 0.451000)
tr 3.515000 0.000000 3.515000 ( 3.925000)
tr 2.284000 0.000000 2.284000 ( 2.484000)
tr_s 3.545000 0.010000 3.555000 ( 3.845000)
tr_s! 2.193000 0.000000 2.193000 ( 2.303000)
upcase 2.023000 0.000000 2.023000 ( 2.103000)
upcase! 0.631000 0.000000 0.631000 ( 0.651000)
require "benchmark"
include Benchmark
s1 = " hello "
s2 = " hello "
s3 = " hello "
max = 500000
bm do |bench|
bench.report("capitalize"){
max.times{ s1.capitalize }
}
bench.report("capitalize!"){
max.times{ s1.capitalize! }
}
bench.report("chomp"){
max.times{ s1.chomp }
}
bench.report("chomp!"){
max.times{ s1.chomp! }
}
bench.report("delete"){
max.times{ s1.delete("o") }
}
bench.report("delete!"){
max.times{ s1.delete!("o") }
}
bench.report("downcase"){
max.times{ s1.downcase }
}
bench.report("downcase!"){
max.times{ s1.downcase! }
}
bench.report("gsub"){
max.times{ s1.gsub(/e/,"i") }
}
bench.report("gsub!"){
max.times{ s1.gsub!(/e/,"i") }
}
bench.report("lstrip"){
max.times{ s1.lstrip }
}
bench.report("lstrip!"){
max.times{ s1.lstrip! }
}
bench.report("next"){
max.times{ s1.next }
}
bench.report("next!"){
max.times{ s1.next! }
}
bench.report("reverse"){
max.times{ s1.reverse }
}
bench.report("reverse!"){
max.times{ s1.reverse! }
}
bench.report("rstrip"){
max.times{ s1.rstrip }
}
bench.report("rstrip!"){
max.times{ s1.rstrip! }
}
bench.report("slice"){
max.times{ s2.slice(1..4) }
}
bench.report("slice!"){
max.times{ s2.slice!(1..4) }
}
bench.report("strip"){
max.times{ s2.strip }
}
bench.report("strip!"){
max.times{ s2.strip! }
}
bench.report("sub"){
max.times{ s2.sub(/e/,"i") }
}
bench.report("sub!"){
max.times{ s2.sub!(/e/,"i") }
}
bench.report("swapcase"){
max.times{ s2.swapcase }
}
bench.report("swapcase!"){
max.times{ s2.swapcase! }
}
bench.report("tr"){
max.times{ s3.tr("e","a") }
}
bench.report("tr"){
max.times{ s3.tr!("e","a") }
}
bench.report("tr_s"){
max.times{ s3.tr_s("a","e") }
}
bench.report("tr_s!"){
max.times{ s3.tr_s!("a","e") }
}
bench.report("upcase"){
max.times{ s3.upcase }
}
bench.report("upcase!"){
max.times{ s3.upcase! }
}
end
Regards,
Dan