From: Robert Klemme Date: 2008-03-17T22:04:52+09:00 Subject: Re: Ruby "Speedup" hints? On 17.03.2008 13:42, Marc Heiler wrote: > Anyone of you has a few hints on how to speed up ruby code? > (Note - not writing it, but running it ;-) ) > > I only have a few hints, like 5... would love to extend it. > > So without further ado: > > - Using << instead of += for Strings as += creates a new object > whereas << will simply work on the current object. I'd replace that with the general rule to avoid object creation because that will cover more cases (Array#concat vs. Array#+, String#gsub! vs. String#gsub etc.). > - Use Inline C for critical methods (had to include that ;> ) You could argue that this does not speed up Ruby code but replaces it with something else. So it's questionable whether this item should be on the list. > - Reusing variable names might be better than using a lot of > different variables Are you talking about a fact or a guess here? You write "might" - which indicates to me that this is not a proven fact. > - for is faster than .each on Arrays > > - .last is faster than [0] I guess you meant Array#last is faster than Array#[-1] or Array#first is faster than Array#[0]. > - .zero? is faster than == 0 Interesting, I did not know that. But the difference is really small: robert@fussel ~ $ time ruby -e '1_000_000.times { 0.zero? }' real 0m0.748s user 0m0.468s sys 0m0.108s robert@fussel ~ $ time ruby -e '1_000_000.times { 1.zero? }' real 0m0.748s user 0m0.483s sys 0m0.124s robert@fussel ~ $ time ruby -e '1_000_000.times { 0 == 0 }' real 0m0.869s user 0m0.561s sys 0m0.108s robert@fussel ~ $ time ruby -e '1_000_000.times { 1 == 0 }' real 0m0.857s user 0m0.562s sys 0m0.124s robert@fussel ~ $ > If you know a few more hints, please add! - freeze Strings that you are going to use as Hash keys. Often bad design makes programs slow. While these are valid points often the bigger effect can be achieved by proper designing an application (i.e. use a Hash for frequent lookups instead of traversing an Aarry). Kind regards robert