On Fri, 2 Sep 2016 15:15:07 +0100 Tom Hacohen <t...@osg.samsung.com> said:
> Good job trying to tackle it, but this is wrong. > > This is not thread-safe and the Eo infrastructure should be. So > essentially, this optimisation is not allowed. You could maybe do a > cache per-thread, raster claims that __thread is actually quite alright > nowadays with GCC, I'm not sure, but this, and the following patch > should be reverted. i looked more and more. we are both right. and both wrong. __thread is FREE ... in a binary. it's a tls lookup in a .so. because the compiler cant pre-allocate a memory region for this info so it has to use the current stack frame to jump to a tls section. > If you have anything to say to defend this approach, please do so by > Monday, otherwise I'll revert both patches then. ummm i already wrapped them with spinlocks earlier this week. thats when i started to go "there has to be a better way" because real life testing (perf not callgrind) made eo ptr lookup go from 2% to 5% of cpu. thus my wondering if making this per-thread might not help. that is a whole topic on its own BUT i still think its a good idea: tls 0.33556 400000002 = 1.546 ns / get spin 0.89498 300000000 = 7.585 ns / lock+release a tls lookup is almost 5 TIMES faster than a spinlock lock + unlock. given that and our discussion which i'll do a writeup on that adds safety to eo and threading (ie makes it impossible to use an eo obj outside its owning thread unless its explicitly sent/shared there) is probably totally worth it as we can remove basically all the locks really used outside of app init (_eoid_lock, an eo_isa lock, klass->iterators.trash_lock). but this does bring design considerations into play and we need to have a talk about this. i'll draft up some mail describing this all later. > -- > Tom. > > On 26/08/16 20:14, Cedric BAIL wrote: > > cedric pushed a commit to branch master. > > > > http://git.enlightenment.org/core/efl.git/commit/?id=93a706a947cd2d6ef80f8704f4e23737fea1258f > > > > commit 93a706a947cd2d6ef80f8704f4e23737fea1258f > > Author: Cedric BAIL <ced...@osg.samsung.com> > > Date: Fri Aug 26 12:03:08 2016 -0700 > > > > eo: general speedup of all Eo related operation. > > > > This change rely on the fact that we do fetch the same > > object id over and over again. _efl_object_call_resolve got > > 15% faster, efl_data_scope_get 20%. > > --- > > src/lib/eo/eo_base_class.c | 3 +++ > > src/lib/eo/eo_ptr_indirection.x | 20 +++++++++++++++++++- > > 2 files changed, 22 insertions(+), 1 deletion(-) > > > > diff --git a/src/lib/eo/eo_base_class.c b/src/lib/eo/eo_base_class.c > > index 732d063..35c7a9c 100644 > > --- a/src/lib/eo/eo_base_class.c > > +++ b/src/lib/eo/eo_base_class.c > > @@ -11,6 +11,9 @@ > > > > static int event_freeze_count = 0; > > > > +_Eo_Object *cached_object = NULL; > > +Eo_Id cached_id = 0; > > + > > typedef struct _Eo_Callback_Description Eo_Callback_Description; > > > > typedef struct > > diff --git a/src/lib/eo/eo_ptr_indirection.x > > b/src/lib/eo/eo_ptr_indirection.x index d89b1ec..cae59a4 100644 > > --- a/src/lib/eo/eo_ptr_indirection.x > > +++ b/src/lib/eo/eo_ptr_indirection.x > > @@ -269,6 +269,9 @@ extern Generation_Counter _eo_generation_counter; > > /* Macro used for readability */ > > #define TABLE_FROM_IDS _eo_ids_tables[mid_table_id][table_id] > > > > +extern _Eo_Object *cached_object; > > +extern Eo_Id cached_id; > > + > > static inline _Eo_Object * > > _eo_obj_pointer_get(const Eo_Id obj_id) > > { > > @@ -289,6 +292,10 @@ _eo_obj_pointer_get(const Eo_Id obj_id) > > DBG("obj_id is not a valid object id."); > > return NULL; > > } > > + else if (obj_id == cached_id) > > + { > > + return cached_object; > > + } > > > > EO_DECOMPOSE_ID(obj_id, mid_table_id, table_id, entry_id, generation); > > > > @@ -297,7 +304,13 @@ _eo_obj_pointer_get(const Eo_Id obj_id) > > { > > entry = &(TABLE_FROM_IDS->entries[entry_id]); > > if (entry && entry->active && (entry->generation == generation)) > > - return entry->ptr; > > + { > > + // Cache the result of that lookup > > + cached_object = entry->ptr; > > + cached_id = obj_id; > > + > > + return entry->ptr; > > + } > > } > > > > ERR("obj_id %p is not pointing to a valid object. Maybe it has already > > been freed.", @@ -477,6 +490,11 @@ _eo_id_release(const Eo_Id obj_id) > > if (_current_table == table) > > _current_table = NULL; > > } > > + > > + // In case an object is destroyed, wipe out the cache > > + cached_id = 0; > > + cached_object = NULL; > > + > > return; > > } > > } > > > > > ------------------------------------------------------------------------------ > _______________________________________________ > enlightenment-devel mailing list > enlightenment-devel@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/enlightenment-devel > -- ------------- Codito, ergo sum - "I code, therefore I am" -------------- The Rasterman (Carsten Haitzler) ras...@rasterman.com ------------------------------------------------------------------------------ _______________________________________________ enlightenment-devel mailing list enlightenment-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-devel