so now we're getting more into eo... it's time to look at 3 things that turn up
on my profiles of things that are NOT expedite.

     8.21%  elementary_test  libeo.so.1.9.99      [.] eo_do_internal
     7.77%  elementary_test  libeo.so.1.9.99      [.] _ev_cb_call
     3.03%  elementary_test  libeo.so.1.9.99      [.] eo_data_scope_get

this is a pretty simply test. open elm test. scroll to bottom, scroll back to
top. close.  almost 20% of our cpu is spent in the above 3 calls. it's time to
cut this down... a LOT.

so i am looking at _ev_cb_call() and callbacks in general. this is a single
linked list of cb's for ALL cb's for an object. we filter out cb's not matching
the callback type (desc) as we walk the list. this of course causes us to do a
lot of cache misses and hunt through a lot of memory to then... do nothing.

imho this needs to be restructured to...

1. have fewer linked list nodes. that means instead of:

  node (cb) -> node (cb2) -> node (cb3) ...

what might be better is:

  node (cb1,cb2,cb3,cb4,cb5,cb6,cb7,cb8) -> node (cb9,cb10,cb11,cb12) ...

ie bigger buckets with more cb's per buckets, fewer links. possibly have a cb
"optimizer" that figures out if the cb list has been changed since it last
optimized and then might group all cb's into a flat array (if cb's are removed,
array is split at that point and fragments until the next optimize call). this
should save a little memory too.

2. but much more important here is to divide cb's into type specific
lists/arrays so we don't walk tonnes of cb's we then filter out, and to have a
fast "select" to select the appropriate list to walk for that event (as we call
1 event at a time only - but all cb's for that event).

3. global freeze_count AND object freeze count is checked in the inner loop per
walk, and not outside the loop before even beginning a walk! these should at
least be checked first to abort any callback list walk that we KNOW will all
fail. we know the desc is unfreezable direct from the input desc and don't
need to use the cb->items.item.desc.

... comments?

now eo_data_scope_get()... i can't find much to imptove here... the mixin path
isn't hit often and data_sizes are notmally > 0... so some way to oprimize:

   if (EINA_LIKELY((klass->desc->data_size > 0) && (klass->desc->type !=
EO_CLASS_TYPE_MIXIN))) return ((char *) obj) + _eo_sz + klass->data_offset;

is most likely what's needed... but there isn't much there. :)

now eo_do_internal()... i think we need to wait for eo2... TOM!

-- 
------------- Codito, ergo sum - "I code, therefore I am" --------------
The Rasterman (Carsten Haitzler)    ras...@rasterman.com


------------------------------------------------------------------------------
Learn Graph Databases - Download FREE O'Reilly Book
"Graph Databases" is the definitive new guide to graph databases and their
applications. Written by three acclaimed leaders in the field,
this first edition is now available. Download your free book today!
http://p.sf.net/sfu/13534_NeoTech
_______________________________________________
enlightenment-devel mailing list
enlightenment-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-devel

Reply via email to