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