Write it up here… http://rubygarden.org/ruby/page/show/RubyOptimization
…the wiki page where I keep breadcrumbs of info for when desperation
requires me to shovel perfectly correct nostrums to one side and put in a
twist of speed.
Speaking of which… Rubygarden seems to be slow…
Too slow for me to write this up, as a matter of fact.
John C. Phone : (64)(3) 358 6639
Tait Electronics Fax : (64)(3) 359 4632
PO Box 1645 Christchurch Email : [email protected]
New Zealand
I’ll remember this next time I want to save 0.03 s per 1000000 iterations.
My original point was that if you want to do something n times, use n.times
My point was going to be that the one place optimisation really matters
is in benchmark code - you only want to measure the effect you’re
looking for - but I managed to shoot myself in the foot and prove
another point. Don’t assume, measure!
Benchmark.bmbm(20) do |x|
x.report(“range”){for i in 0…1000000 do nop end}
x.report(“times”){1000000.times do nop end}
x.report(“each”){(0…1000000).each do nop end}
end
range 0.657000 0.000000 0.657000 ( 0.656000)
times 0.609000 0.000000 0.609000 ( 0.609000)
each 0.594000 0.000000 0.594000 ( 0.594000)
----------------------------- total: 1.860000sec
user system total real
range 0.641000 0.000000 0.641000 ( 0.640000)
times 0.594000 0.000000 0.594000 ( 0.594000)
each 0.578000 0.000000 0.578000 ( 0.594000)
My point was going to be that the one place optimisation really matters
is in benchmark code - you only want to measure the effect you’re
looking for - but I managed to shoot myself in the foot and prove
another point. Don’t assume, measure!
If that’s the case you shouldn’t be making a nop() method call.
That’s a huge part of what you’re seeing there.
It has nothing to do with timing. It’s about ugly verses pretty.
To be perfectly honest, I had it fixed in my head that for…in… was
faster than N.times {} when I wrote the original code, and was just
trying to get rid of an unnecessary overhead. Just shows what use
assumptions like that are…
measure!
Even if one of the iterators (each or times) was much faster than the
other, as long as you use the same one every time you’re controlling
for that. You just wouldn’t want to go back and forth.