Robert Klemme
1/10/2007 8:11:00 AM
On 09.01.2007 22:17, khaines@enigo.com wrote:
> On Wed, 10 Jan 2007, Gavin Kistner wrote:
>
>> From: Vincent Fourmond
>>> user system total real
>>> 0.010000 0.000000 0.010000 ( 0.009087)
>>> 0.010000 0.000000 0.010000 ( 0.008774)
>>> 0.000000 0.000000 0.000000 ( 0.004621)
>>
>> Perhaps your machine is more deterministic than mine, but successive
>> runs of that benchmark (and using #bmbm to be safer about the
>> measurement) sometimes show 'a' faster than "a", sometimes slower.
>>
>> Even with benchmarking, I wouldn't trust that answers that are within a
>> few percent of each other. And I certainly wouldn't rush off to refactor
>> code because of it.
>
> Increase n from 5000 to 500000 or 5000000.
>
> To understand the difference, just think about how many strings are
> being created with each.
>
> 'a' creates a new string, as does 'b'.
> The + operation creates a new string, as well.
>
> So, there's a lot of new string creation happening with either of the +
> examples.
>
> Change the +'s to << and you will see a difference.
>
> 'a' << x << 'b'
>
> << just changes the old String.
>
> The "a#{x}b" example does the least work.
I have added some alternatives - string interpolation still wins
robert@fussel /cygdrive/c/temp
$ ruby str_bench.rb
Rehearsal -------------------------------------------
'a' + 2.860000 0.000000 2.860000 ( 2.859000)
"a" + 2.890000 0.000000 2.890000 ( 2.891000)
a#{ 1.860000 0.000000 1.860000 ( 1.859000)
"" << 3.734000 0.000000 3.734000 ( 3.734000)
"a" << 2.328000 0.000000 2.328000 ( 2.328000)
A + 2.625000 0.000000 2.625000 ( 2.625000)
"" << A 3.453000 0.000000 3.453000 ( 3.453000)
--------------------------------- total: 19.750000sec
user system total real
'a' + 2.906000 0.000000 2.906000 ( 2.907000)
"a" + 2.891000 0.000000 2.891000 ( 2.890000)
a#{ 1.859000 0.000000 1.859000 ( 1.860000)
"" << 3.766000 0.000000 3.766000 ( 3.765000)
"a" << 2.344000 0.000000 2.344000 ( 2.344000)
A + 2.640000 0.000000 2.640000 ( 2.641000)
"" << A 3.469000 0.000000 3.469000 ( 3.468000)
robert@fussel /cygdrive/c/temp
$ cat str_bench.rb
require 'benchmark'
n = 1_000_000
c = "stuff"
A = "a"
B = "b"
Benchmark.bmbm do |x|
x.report('\'a\' +') { n.times {'a' + c + 'b'}}
x.report('"a" +') { n.times {"a" + c + "b"}}
x.report('a#{') { n.times {"a#{c}b"}}
x.report('"" <<') { n.times {"" << "a" << c << "b"}}
x.report('"a" <<') { n.times {"a" << c << "b"}}
x.report('A +') { n.times {A + c + B}}
x.report('"" << A') { n.times {"" << A << c << B}}
end
robert