Ryan Davis
3/29/2006 9:52:00 PM
On Mar 27, 2006, at 1:18 PM, John Carter wrote:
> I have a couple of classes like so...
>
> class Foo
> def step1
> @mine = Hash.new
> # Perhaps stuff things into @mine
> end
>
> def step2
> @mine.each_pair do |key,value|
> # Do stuff
> end
> end
> end
>
> Profiling with my "new" profiler shows that I'm creating many many
> Hash objects, probably way more than I need. In fact most of them
> are empty.
>
> Optimization trick...
Maybe it is just me, but I find your original code much easier to
read and intuitive than your second version. There is just too much
wonky-thought going on in the second version and it'll make it easy
to get it wrong (esp if this pattern spreads throughout a large code
base). I don't know what your real code is doing, but creating empty
hashes seems fine to me. They don't actually cost all that much:
% time ruby -e '1_000_000.times do Hash.new; end'
real 0m7.107s
user 0m3.432s
sys 0m0.101s
(with itunes running in the background no less)
One suggestion I could make is to recycle if you really are making
too many empty hashes. If you are running step1/2 in a loop and doing
a lot of such work, only reinstantiate @mine if you need to:
def initialize
@mine = Hash.new
end
def step1
@mine = Hash.new unless @mine.empty?
# ...
end
That is only a teeny change to your original logic and meets your
goals of creating less hashes. I can read that and grok the intent
immediately. I can't with your rewrite.
--
_why: zenspider's most intense moments of solice are immediately
following the slaughter [...]
_why: that topknot's the only thing keeping a lid on the righteous anger
bricolage: yeah, that and his flagrant obsession with dvorak