On 01 Jun 2005, at 18:36, Gyoung-Yoon Noh wrote:
=20
=20
The difference is not in the speed of the operations themselves, it
is in the memory pressure on the GC. Your benchmark is not a fair
comparison between the two because it ignores the side-effect of
memory pressure and does not fit with the way you would use chaining
vs !.
=20
This benchmark more realisticly shows the effects of memory pressure
and is more fitting with how you would really use chaining vs !:
=20
$ cat sub.rb
require 'benchmark'
=20
N =3D 10_000
STR =3D (0..N).to_a.join('-')
=20
Benchmark.bmbm do |bm|
bm.report("Base") do
str =3D STR.dup
N.times { }
end
=20
bm.report("Destructive") do
str =3D STR.dup
N.times { str.sub!(/\d+/, '-') }
end
=20
bm.report("Non-destructive") do
str =3D STR.dup
N.times { str =3D str.sub(/\d+/, '-') }
end
end
=20
$ ruby sub.rb
Rehearsal ---------------------------------------------------
Base 0.000000 0.000000 0.000000 ( 0.003034)
Destructive 1.470000 1.380000 2.850000 ( 3.266492)
Non-destructive 1.930000 2.740000 4.670000 ( 5.584387)
------------------------------------------ total: 7.520000sec
=20
user system total real
Base 0.000000 0.000000 0.000000 ( 0.002857)
Destructive 1.460000 1.400000 2.860000 ( 3.383933)
Non-destructive 1.910000 2.800000 4.710000 ( 5.688635)
=20
=20
=20
Your benchmark wasn't helpful in revealing the true difference
between the two methods. As you can see, the non-destructive case
takes much more time in user space because the GC has to clean up all
the temporary strings.
=20
It also takes ~33% more time in general because of the GC.
=20
=20
It wraps a C string.
=20
=20
Certain operations are COW.
=20
--
Eric Hodel - (e-mail address removed) -
http://segment7.net
FEC2 57F1 D465 EB15 5D6E 7C11 332A 551C 796C 9F04
=20
=20
=20