raster pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=a2d507d3bfd12b84620eb7361b8fd8f3a5ba0dda

commit a2d507d3bfd12b84620eb7361b8fd8f3a5ba0dda
Author: Carsten Haitzler (Rasterman) <ras...@rasterman.com>
Date:   Sat Oct 1 17:51:25 2016 +0900

    eina list - make use of prefetch for minor speedups
    
    i see a speedup of about 8% over a series of list walking and freeing
    functions given this change. it's a small speedup but still not too
    shabby just for some prefetches thrown in. ymmv depending on memory
    subsystem, memory speed itself, cpu and architecture.
    
    @optimize
---
 src/lib/eina/eina_list.h | 34 +++++++++++++++++++++++++---------
 1 file changed, 25 insertions(+), 9 deletions(-)

diff --git a/src/lib/eina/eina_list.h b/src/lib/eina/eina_list.h
index e35943e..146601d 100644
--- a/src/lib/eina/eina_list.h
+++ b/src/lib/eina/eina_list.h
@@ -1411,12 +1411,16 @@ EAPI int                   eina_list_data_idx(const 
Eina_List *list, void *data)
  *          For destructive operations such as this, consider
  *          using EINA_LIST_FOREACH_SAFE().
  */
-#define EINA_LIST_FOREACH(list, l, data) \
+#define EINA_LIST_FOREACH(list, l, _data)\
   for (l = list,                         \
-       data = eina_list_data_get(l);     \
+       _data = eina_list_data_get(l),    \
+       l ? (EINA_PREFETCH(l->next), EINA_PREFETCH(_data)) : EINA_PREFETCH(l); \
+                                         \
        l;                                \
+                                         \
        l = eina_list_next(l),            \
-       data = eina_list_data_get(l))
+       _data = eina_list_data_get(l),    \
+       l ? (EINA_PREFETCH(l->next), EINA_PREFETCH(_data)) : EINA_PREFETCH(l))
 
 /**
  * @def EINA_LIST_REVERSE_FOREACH
@@ -1469,12 +1473,14 @@ EAPI int                   eina_list_data_idx(const 
Eina_List *list, void *data)
  *          For destructive operations such as this, consider
  *          using EINA_LIST_REVERSE_FOREACH_SAFE().
  */
-#define EINA_LIST_REVERSE_FOREACH(list, l, data) \
+#define EINA_LIST_REVERSE_FOREACH(list, l, _data)\
   for (l = eina_list_last(list),                 \
-       data = eina_list_data_get(l);             \
+       _data = eina_list_data_get(l),            \
+       l ? (EINA_PREFETCH(l->prev), EINA_PREFETCH(_data)) : EINA_PREFETCH(l); \
        l;                                        \
        l = eina_list_prev(l),                    \
-       data = eina_list_data_get(l))
+       _data = eina_list_data_get(l),            \
+       l ? (EINA_PREFETCH(l->prev), EINA_PREFETCH(_data)) : EINA_PREFETCH(l))
 
 /**
  * @def EINA_LIST_FOREACH_SAFE
@@ -1525,11 +1531,15 @@ EAPI int                   eina_list_data_idx(const 
Eina_List *list, void *data)
 #define EINA_LIST_FOREACH_SAFE(list, l, l_next, data) \
   for (l = list,                                      \
        l_next = eina_list_next(l),                    \
+       EINA_PREFETCH(l_next),                         \
        data = eina_list_data_get(l);                  \
+       EINA_PREFETCH(data),                           \
        l;                                             \
        l = l_next,                                    \
        l_next = eina_list_next(l),                    \
-       data = eina_list_data_get(l))
+       EINA_PREFETCH(l_next),                         \
+       data = eina_list_data_get(l),                  \
+       EINA_PREFETCH(data))
 
 /**
  * @def EINA_LIST_REVERSE_FOREACH_SAFE
@@ -1582,11 +1592,15 @@ EAPI int                   eina_list_data_idx(const 
Eina_List *list, void *data)
 #define EINA_LIST_REVERSE_FOREACH_SAFE(list, l, l_prev, data) \
   for (l = eina_list_last(list),                              \
        l_prev = eina_list_prev(l),                            \
+       EINA_PREFETCH(l_prev),                                 \
        data = eina_list_data_get(l);                          \
+       EINA_PREFETCH(data),                                   \
        l;                                                     \
        l = l_prev,                                            \
        l_prev = eina_list_prev(l),                            \
-       data = eina_list_data_get(l))
+       EINA_PREFETCH(l_prev),                                 \
+       data = eina_list_data_get(l),                          \
+       EINA_PREFETCH(data))
 
 /**
  * @def EINA_LIST_FREE
@@ -1624,9 +1638,11 @@ EAPI int                   eina_list_data_idx(const 
Eina_List *list, void *data)
  * @see eina_list_free()
  */
 #define EINA_LIST_FREE(list, data)               \
-  for (data = eina_list_data_get(list);          \
+  for (data = eina_list_data_get(list),          \
+       list ? EINA_PREFETCH((list)->next) : EINA_PREFETCH(list); \
        list;                                     \
        list = eina_list_remove_list(list, list), \
+       list ? EINA_PREFETCH((list)->next) : EINA_PREFETCH(list), \
        data = eina_list_data_get(list))
 
 #include "eina_inline_list.x"

-- 


Reply via email to