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
This commit is contained in:
Carsten Haitzler 2016-10-01 17:51:25 +09:00
parent a06f5c1024
commit a2d507d3bf
1 changed files with 25 additions and 9 deletions

View File

@ -1411,12 +1411,16 @@ EAPI int eina_list_data_idx(const Eina_List *list, void *data)
* For destructive operations such as this, consider * For destructive operations such as this, consider
* using EINA_LIST_FOREACH_SAFE(). * using EINA_LIST_FOREACH_SAFE().
*/ */
#define EINA_LIST_FOREACH(list, l, data) \ #define EINA_LIST_FOREACH(list, l, _data)\
for (l = list, \ 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; \
\
l = eina_list_next(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 * @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 * For destructive operations such as this, consider
* using EINA_LIST_REVERSE_FOREACH_SAFE(). * 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), \ 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; \
l = eina_list_prev(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 * @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) \ #define EINA_LIST_FOREACH_SAFE(list, l, l_next, data) \
for (l = list, \ for (l = list, \
l_next = eina_list_next(l), \ l_next = eina_list_next(l), \
EINA_PREFETCH(l_next), \
data = eina_list_data_get(l); \ data = eina_list_data_get(l); \
EINA_PREFETCH(data), \
l; \ l; \
l = l_next, \ l = l_next, \
l_next = eina_list_next(l), \ 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 * @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) \ #define EINA_LIST_REVERSE_FOREACH_SAFE(list, l, l_prev, data) \
for (l = eina_list_last(list), \ for (l = eina_list_last(list), \
l_prev = eina_list_prev(l), \ l_prev = eina_list_prev(l), \
EINA_PREFETCH(l_prev), \
data = eina_list_data_get(l); \ data = eina_list_data_get(l); \
EINA_PREFETCH(data), \
l; \ l; \
l = l_prev, \ l = l_prev, \
l_prev = eina_list_prev(l), \ 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 * @def EINA_LIST_FREE
@ -1624,9 +1638,11 @@ EAPI int eina_list_data_idx(const Eina_List *list, void *data)
* @see eina_list_free() * @see eina_list_free()
*/ */
#define EINA_LIST_FREE(list, data) \ #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; \
list = eina_list_remove_list(list, list), \ list = eina_list_remove_list(list, list), \
list ? EINA_PREFETCH((list)->next) : EINA_PREFETCH(list), \
data = eina_list_data_get(list)) data = eina_list_data_get(list))
#include "eina_inline_list.x" #include "eina_inline_list.x"