raster pushed a commit to branch master. http://git.enlightenment.org/core/efl.git/commit/?id=7b3e7ecc1ffe960d1df32a76ffd243d77a1f7fa9
commit 7b3e7ecc1ffe960d1df32a76ffd243d77a1f7fa9 Author: Carsten Haitzler (Rasterman) <ras...@rasterman.com> Date: Sat Oct 1 23:37:34 2016 +0900 eo - eo ptr lookup - do some prefetches to get some micro-speedups prefetching a bit helps.. a bit like 0.2% or so... but it does help. :) --- src/lib/eo/eo_ptr_indirection.c | 42 ++++++++++++++++++++++------------------- src/lib/eo/eo_ptr_indirection.x | 18 +++++++++--------- 2 files changed, 32 insertions(+), 28 deletions(-) diff --git a/src/lib/eo/eo_ptr_indirection.c b/src/lib/eo/eo_ptr_indirection.c index e891bfb..568b9f8 100644 --- a/src/lib/eo/eo_ptr_indirection.c +++ b/src/lib/eo/eo_ptr_indirection.c @@ -66,7 +66,6 @@ _eo_obj_pointer_get(const Eo_Id obj_id) { #ifdef HAVE_EO_ID _Eo_Id_Entry *entry; - _Eo_Object *ptr; Generation_Counter generation; Table_Index mid_table_id, table_id, entry_id; Eo_Id tag_bit; @@ -77,27 +76,30 @@ _eo_obj_pointer_get(const Eo_Id obj_id) // NULL objects will just be sensibly ignored. not worth complaining // every single time. - domain = (obj_id >> SHIFT_DOMAIN) & MASK_DOMAIN; data = _eo_table_data_get(); + EINA_PREFETCH(&(data->tables[0])); + domain = (obj_id >> SHIFT_DOMAIN) & MASK_DOMAIN; tdata = _eo_table_data_table_get(data, domain); - if (!tdata) goto err; + EINA_PREFETCH(&(tdata->cache.id)); + if (EINA_UNLIKELY(!tdata)) goto err; if (EINA_LIKELY(domain != EFL_ID_DOMAIN_SHARED)) { if (obj_id == tdata->cache.id) - { - ptr = tdata->cache.object; - return ptr; - } + return tdata->cache.object; + + mid_table_id = (obj_id >> SHIFT_MID_TABLE_ID) & MASK_MID_TABLE_ID; + EINA_PREFETCH(&(tdata->eo_ids_tables[mid_table_id])); + table_id = (obj_id >> SHIFT_TABLE_ID) & MASK_TABLE_ID; + entry_id = (obj_id >> SHIFT_ENTRY_ID) & MASK_ENTRY_ID; + generation = obj_id & MASK_GENERATIONS; // get tag bit to check later down below - pipelining tag_bit = (obj_id) & MASK_OBJ_TAG; if (!obj_id) goto err_null; else if (!tag_bit) goto err; - EO_DECOMPOSE_ID(obj_id, mid_table_id, table_id, entry_id, generation); - // Check the validity of the entry if (tdata->eo_ids_tables[mid_table_id]) { @@ -111,8 +113,7 @@ _eo_obj_pointer_get(const Eo_Id obj_id) // Cache the result of that lookup tdata->cache.object = entry->ptr; tdata->cache.id = obj_id; - ptr = entry->ptr; - return ptr; + return entry->ptr; } } } @@ -122,18 +123,22 @@ _eo_obj_pointer_get(const Eo_Id obj_id) { eina_lock_take(&(_eo_table_data_shared_data->obj_lock)); if (obj_id == tdata->cache.id) - { - ptr = tdata->cache.object; - return ptr; - } + // yes we return keeping the lock locked. thats why + // you must call _eo_obj_pointer_done() wrapped + // by EO_OBJ_DONE() to release + return tdata->cache.object; + + mid_table_id = (obj_id >> SHIFT_MID_TABLE_ID) & MASK_MID_TABLE_ID; + EINA_PREFETCH(&(tdata->eo_ids_tables[mid_table_id])); + table_id = (obj_id >> SHIFT_TABLE_ID) & MASK_TABLE_ID; + entry_id = (obj_id >> SHIFT_ENTRY_ID) & MASK_ENTRY_ID; + generation = obj_id & MASK_GENERATIONS; // get tag bit to check later down below - pipelining tag_bit = (obj_id) & MASK_OBJ_TAG; if (!obj_id) goto err_shared_null; else if (!tag_bit) goto err_shared; - EO_DECOMPOSE_ID(obj_id, mid_table_id, table_id, entry_id, generation); - // Check the validity of the entry if (tdata->eo_ids_tables[mid_table_id]) { @@ -147,11 +152,10 @@ _eo_obj_pointer_get(const Eo_Id obj_id) // Cache the result of that lookup tdata->cache.object = entry->ptr; tdata->cache.id = obj_id; - ptr = entry->ptr; // yes we return keeping the lock locked. thats why // you must call _eo_obj_pointer_done() wrapped // by EO_OBJ_DONE() to release - return ptr; + return entry->ptr; } } } diff --git a/src/lib/eo/eo_ptr_indirection.x b/src/lib/eo/eo_ptr_indirection.x index de4251e..ee965ee 100644 --- a/src/lib/eo/eo_ptr_indirection.x +++ b/src/lib/eo/eo_ptr_indirection.x @@ -251,12 +251,6 @@ typedef struct _Eo_Id_Table_Data Eo_Id_Table_Data; struct _Eo_Id_Table_Data { - /* Tables handling pointers indirection */ - _Eo_Ids_Table **eo_ids_tables[MAX_MID_TABLE_ID]; - /* Current table used for following allocations */ - _Eo_Ids_Table *current_table; - /* Spare empty table */ - _Eo_Ids_Table *empty_table; /* Cached eoid lookups */ struct { @@ -267,12 +261,18 @@ struct _Eo_Id_Table_Data Eina_Bool isa; } cache; - /* Next generation to use when assigning a new entry to a Eo pointer */ - Generation_Counter generation; + /* Tables handling pointers indirection */ + _Eo_Ids_Table **eo_ids_tables[MAX_MID_TABLE_ID]; + /* Current table used for following allocations */ + _Eo_Ids_Table *current_table; + /* Spare empty table */ + _Eo_Ids_Table *empty_table; /* Optional lock around all objects in eoid table - only used if shared */ Eina_Lock obj_lock; + /* Next generation to use when assigning a new entry to a Eo pointer */ + Generation_Counter generation; /* are we shared so we need lock/unlock? */ - Eina_Bool shared : 1; + Eina_Bool shared; }; struct _Eo_Id_Data --