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