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

-- 


Reply via email to