[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

New Optimization idea.

John Carter

3/27/2006 9:18:00 PM

2 Answers

Robert Klemme

3/28/2006 6:56:00 PM

0

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...
>
>
> class Object
> FROZEN_EMPTY_HASH = Hash.new.freeze
> end
>
> class Foo
> @@hash_cache = Hash.new
>
> def step1
> @mine = @@hash_cache
> # Perhaps stuff things into @mine
> if @mine.empty?
> @mine = FROZEN_EMPTY_HASH
> else
> @@hash_cache = Hash.new
> end
> end
>
> def step2
> @mine.each_pair do |key,value|
> # Do stuff
> end
> end
> end

You could as well leave the member nil and change the getter appropriately:

class Foo
def mine() @mine || FROZEN_EMPTY_HASH end
def step2() mine.each_pair ...
end

Or do the test in step2...
@mine and @mine.each_pair ...

Kind regards

robert

Ryan Davis

3/29/2006 9:52:00 PM

0


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