After benchmarking, providing inline does impact performance of list and array user.

SVN revision: 35406
This commit is contained in:
Cedric BAIL 2008-08-08 14:20:11 +00:00
parent 5cfb71ff72
commit ce23f3c2a9
9 changed files with 73 additions and 94 deletions

View File

@ -17,7 +17,8 @@ eina_array.h \
eina_counter.h \
eina_inline_array.x \
eina_magic.h \
eina_stringshare.h
eina_stringshare.h \
eina_inline_list.x
installed_mainheaderdir = $(prefix)/include/eina-@VMAJ@
installed_mainheader_DATA = Eina.h

View File

@ -32,19 +32,26 @@ struct _Eina_Array /** An array of data */
unsigned int step; /**< How much must we grow the vector When it is full */
};
EAPI int eina_array_init (void);
EAPI int eina_array_shutdown (void);
EAPI int eina_array_init (void);
EAPI int eina_array_shutdown (void);
EAPI Eina_Array *eina_array_new (unsigned int step);
EAPI void eina_array_setup (Eina_Array *array, unsigned int step);
EAPI void eina_array_free (Eina_Array *array);
EAPI void eina_array_append (Eina_Array *array, void *data);
EAPI void *eina_array_get (Eina_Array *array, unsigned int index);
EAPI void eina_array_clean (Eina_Array *array);
EAPI void eina_array_flush (Eina_Array *array);
EAPI void eina_array_remove (Eina_Array *array, Eina_Bool (*keep)(void *data, void *gdata), void *gdata);
EAPI Eina_Array * eina_array_new (unsigned int step);
EAPI void eina_array_setup (Eina_Array *array, unsigned int step);
EAPI void eina_array_free (Eina_Array *array);
EAPI void eina_array_clean (Eina_Array *array);
EAPI void eina_array_flush (Eina_Array *array);
EAPI void eina_array_remove (Eina_Array *array, Eina_Bool (*keep)(void *data, void *gdata), void *gdata);
#define EINA_ARRAY_ITER_NEXT(array, index, item) for ((index) = 0, (item) = ((array) && (array)->count > 0) ? _eina_array_get((array), (index)) : NULL; (index) < (array)->count; ++(index), (item) = _eina_array_get((array), (index)))
static inline void * eina_array_get (Eina_Array *array, unsigned int index);
static inline void eina_array_append (Eina_Array *array, void *data);
static inline unsigned int eina_array_count (Eina_Array *array);
#define EINA_ARRAY_ITER_NEXT(array, index, item) \
for ((index) = 0; (index) < eina_array_count(array); ++(index)) \
{ \
(item) = eina_array_get((array), (index));
#define EINA_ARRAY_ITER_END }
#include "eina_inline_array.x"

View File

@ -19,6 +19,8 @@
#ifndef EINA_LIST_H_
#define EINA_LIST_H_
#include <stdlib.h>
#include "eina_types.h"
/**
@ -27,6 +29,21 @@
*/
typedef struct _Eina_List Eina_List;
typedef struct _Eina_List_Accounting Eina_List_Accounting;
struct _Eina_List /** A linked list node */
{
void *data; /**< Pointer to list element payload */
Eina_List *next; /**< Next member in the list */
Eina_List *prev; /**< Previous member in the list */
struct _Eina_List_Accounting *accounting; /**< Private list accounting info - don't touch */
};
struct _Eina_List_Accounting
{
Eina_List *last;
int count;
};
EAPI int eina_list_init(void);
EAPI int eina_list_shutdown(void);
@ -43,17 +60,18 @@ EAPI Eina_List *eina_list_promote_list (Eina_List *list, Eina_List *move_list);
EAPI void *eina_list_find(const Eina_List *list, const void *data);
EAPI Eina_List *eina_list_find_list (const Eina_List *list, const void *data);
EAPI Eina_List *eina_list_free (Eina_List *list);
EAPI Eina_List *eina_list_last (const Eina_List *list);
EAPI Eina_List *eina_list_next (const Eina_List *list);
EAPI Eina_List *eina_list_prev (const Eina_List *list);
EAPI void *eina_list_data(const Eina_List *list);
EAPI int eina_list_count(const Eina_List *list);
EAPI void *eina_list_nth(const Eina_List *list, int n);
EAPI Eina_List *eina_list_nth_list (const Eina_List *list, int n);
EAPI Eina_List *eina_list_reverse (Eina_List *list);
EAPI Eina_List *eina_list_sort (Eina_List *list, int size, int(*func)(void*,void*));
static inline Eina_List *eina_list_last (const Eina_List *list);
static inline Eina_List *eina_list_next (const Eina_List *list);
static inline Eina_List *eina_list_prev (const Eina_List *list);
static inline void *eina_list_data(const Eina_List *list);
static inline int eina_list_count(const Eina_List *list);
/** @} */
#include "eina_inline_list.x"
#endif /* EINA_LIST_H_ */

View File

@ -43,18 +43,6 @@ eina_array_shutdown(void)
return eina_error_shutdown();
}
EAPI void
eina_array_append(Eina_Array *array, void *data)
{
_eina_array_append(array, data);
}
EAPI void *
eina_array_get(Eina_Array *array, unsigned int index)
{
return _eina_array_get(array, index);
}
EAPI void
eina_array_clean(Eina_Array *array)
{
@ -119,7 +107,7 @@ eina_array_remove(Eina_Array *array, Eina_Bool (*keep)(void *data, void *gdata),
for (i = 0; i < array->count; ++i)
{
data = _eina_array_get(array, i);
data = eina_array_get(array, i);
if (keep(data, gdata) == EINA_FALSE) break;
}
@ -127,7 +115,7 @@ eina_array_remove(Eina_Array *array, Eina_Bool (*keep)(void *data, void *gdata),
if (i < array->count) ++i;
for (; i < array->count; ++i)
{
data = _eina_array_get(array, i);
data = eina_array_get(array, i);
if (keep(data, gdata) == EINA_TRUE) break;
}
@ -164,7 +152,7 @@ eina_array_remove(Eina_Array *array, Eina_Bool (*keep)(void *data, void *gdata),
for (; i < array->count; ++i)
{
data = _eina_array_get(array, i);
data = eina_array_get(array, i);
if (keep(data, gdata))
{

View File

@ -65,21 +65,6 @@
/*============================================================================*
* Local *
*============================================================================*/
struct _Eina_List /** A linked list node */
{
void *data; /**< Pointer to list element payload */
Eina_List *next; /**< Next member in the list */
Eina_List *prev; /**< Previous member in the list */
struct _Eina_List_Accounting *accounting; /**< Private list accounting info - don't touch */
};
typedef struct _Eina_List_Accounting Eina_List_Accounting;
struct _Eina_List_Accounting
{
Eina_List *last;
int count;
};
static inline Eina_List_Accounting*
_eina_list_mempool_accounting_new(__UNUSED__ Eina_List *list)
{
@ -604,12 +589,7 @@ eina_list_promote_list(Eina_List *list, Eina_List *move_list)
EAPI void *
eina_list_find(const Eina_List *list, const void *data)
{
const Eina_List *l;
for (l = list; l; l = l->next)
{
if (l->data == data) return (void *)data;
}
if (eina_list_find_list(list, data)) return data;
return NULL;
}
@ -712,12 +692,7 @@ eina_list_free(Eina_List *list)
* @endcode
* @ingroup Eina_List_Traverse_Group
*/
EAPI Eina_List *
eina_list_last(const Eina_List *list)
{
if (!list) return NULL;
return list->accounting->last;
}
static inline Eina_List *eina_list_last(const Eina_List *list);
/**
* Get the next list node after the specified list node
@ -740,12 +715,7 @@ eina_list_last(const Eina_List *list)
* @endcode
* @ingroup Eina_List_Traverse_Group
*/
EAPI Eina_List *
eina_list_next(const Eina_List *list)
{
if (!list) return NULL;
return list->next;
}
static inline Eina_List *eina_list_next(const Eina_List *list);
/**
* Get the previous list node before the specified list node
@ -769,12 +739,7 @@ eina_list_next(const Eina_List *list)
* @endcode
* @ingroup Eina_List_Traverse_Group
*/
EAPI Eina_List *
eina_list_prev(const Eina_List *list)
{
if (!list) return NULL;
return list->prev;
}
static inline Eina_List *eina_list_prev(const Eina_List *list);
/**
* @defgroup Eina_List_General_Group Linked List General Functions
@ -803,12 +768,7 @@ eina_list_prev(const Eina_List *list)
* @endcode
* @ingroup Eina_List_General_Group
*/
EAPI void *
eina_list_data(const Eina_List *list)
{
if (!list) return NULL;
return list->data;
}
static inline void *eina_list_data(const Eina_List *list);
/**
* Get the count of the number of items in a list
@ -829,12 +789,7 @@ eina_list_data(const Eina_List *list)
* @endcode
* @ingroup Eina_List_General_Group
*/
EAPI int
eina_list_count(const Eina_List *list)
{
if (!list) return 0;
return list->accounting->count;
}
static inline int eina_list_count(const Eina_List *list);
/**
* Get the nth member's data pointer in a list

View File

@ -73,6 +73,7 @@ eina_magic_string_get(Eina_Magic magic)
EINA_ARRAY_ITER_NEXT(strings, i, ems)
if (ems->magic == magic)
return ems->string;
EINA_ARRAY_ITER_END;
return NULL;
}
@ -95,6 +96,7 @@ eina_magic_string_set(Eina_Magic magic, const char *magic_name)
ems->string = NULL;
return ;
}
EINA_ARRAY_ITER_END;
ems = malloc(sizeof (Eina_Magic_String));
ems->magic = magic;
@ -103,7 +105,7 @@ eina_magic_string_set(Eina_Magic magic, const char *magic_name)
else
ems->string = NULL;
_eina_array_append(strings, ems);
eina_array_append(strings, ems);
}
EAPI void

View File

@ -50,7 +50,7 @@ static Eina_Bool keep(void *data, __UNUSED__ void *gdata)
}
static void
eina_bench_array_4evas_render(int request)
eina_bench_array_4evas_render_inline(int request)
{
Eina_Array *array;
Eina_Bench_Object *ebo;
@ -79,16 +79,20 @@ eina_bench_array_4evas_render(int request)
{
EINA_ARRAY_ITER_NEXT(array, j, ebo)
free(ebo);
EINA_ARRAY_ITER_END;
eina_array_clean(array);
}
else if (i % 30 == 0) eina_array_remove(array, keep, NULL);
EINA_ARRAY_ITER_NEXT(array, j, ebo)
ebo->keep = rand() < (RAND_MAX / 2) ? ebo->keep : EINA_FALSE;
EINA_ARRAY_ITER_END;
}
EINA_ARRAY_ITER_NEXT(array, j, ebo)
free(ebo);
EINA_ARRAY_ITER_END;
eina_array_free(array);
@ -227,7 +231,7 @@ eina_bench_inlist_4evas_render(int request)
void eina_bench_array(Eina_Bench *bench)
{
eina_bench_register(bench, "array", EINA_BENCH(eina_bench_array_4evas_render), 200, 4000, 100);
eina_bench_register(bench, "array-inline", EINA_BENCH(eina_bench_array_4evas_render_inline), 200, 4000, 100);
eina_bench_register(bench, "list", EINA_BENCH(eina_bench_list_4evas_render), 200, 4000, 100);
eina_bench_register(bench, "inlist", EINA_BENCH(eina_bench_inlist_4evas_render), 200, 4000, 100);
}

View File

@ -68,6 +68,7 @@ eina_bench_lookup_superfast(int request)
EINA_ARRAY_ITER_NEXT(array, i, tmp_val)
free(tmp_val);
EINA_ARRAY_ITER_END;
eina_array_free(array);
}
@ -115,6 +116,7 @@ eina_bench_lookup_djb2(int request)
EINA_ARRAY_ITER_NEXT(array, i, tmp_val)
free(tmp_val);
EINA_ARRAY_ITER_END;
eina_array_free(array);
}
@ -164,6 +166,7 @@ eina_bench_lookup_djb2_inline(int request)
EINA_ARRAY_ITER_NEXT(array, i, tmp_val)
free(tmp_val);
EINA_ARRAY_ITER_END;
eina_array_free(array);
}

View File

@ -45,10 +45,9 @@ START_TEST(eina_array_simple)
fail_if(atoi(eina_array_get(ea, 10)) != 10);
EINA_ARRAY_ITER_NEXT(ea, i, tmp)
{
fail_if((unsigned int) atoi(tmp) != i);
free(tmp);
}
fail_if((unsigned int) atoi(tmp) != i);
free(tmp);
EINA_ARRAY_ITER_END
fail_if(i != 200);
@ -83,10 +82,9 @@ START_TEST(eina_array_static)
fail_if(atoi(eina_array_get(&sea, 10)) != 10);
EINA_ARRAY_ITER_NEXT(&sea, i, tmp)
{
fail_if((unsigned int) atoi(tmp) != i);
free(tmp);
}
fail_if((unsigned int) atoi(tmp) != i);
free(tmp);
EINA_ARRAY_ITER_END
fail_if(i != 200);
@ -141,6 +139,7 @@ START_TEST(eina_array_remove_stuff)
fail_if(eina_array_count(ea) != 990);
EINA_ARRAY_ITER_NEXT(ea, i, tmp)
fail_if(*tmp == 0);
EINA_ARRAY_ITER_END;
// Remove the last items
for (i = 980; i < 990; ++i)
@ -158,6 +157,8 @@ START_TEST(eina_array_remove_stuff)
fail_if(*tmp == 0);
*tmp = 0;
}
EINA_ARRAY_ITER_END;
eina_array_remove(ea, keep_int, NULL);
fail_if(eina_array_count(ea) != 0);