diff --git a/legacy/eina/src/include/eina_list.h b/legacy/eina/src/include/eina_list.h index 9f7f504796..eb8776ce6f 100644 --- a/legacy/eina/src/include/eina_list.h +++ b/legacy/eina/src/include/eina_list.h @@ -88,7 +88,7 @@ EAPI Eina_List *eina_list_free (Eina_List *list); EAPI void *eina_list_nth(const Eina_List *list, unsigned int n); EAPI Eina_List *eina_list_nth_list (const Eina_List *list, unsigned int n); EAPI Eina_List *eina_list_reverse (Eina_List *list); -EAPI Eina_List *eina_list_sort (Eina_List *list, unsigned int size, int(*func)(void*,void*)); +EAPI Eina_List *eina_list_sort (Eina_List *list, unsigned int size, Eina_Compare_Cb func); static inline Eina_List *eina_list_last (const Eina_List *list); static inline Eina_List *eina_list_next (const Eina_List *list); diff --git a/legacy/eina/src/lib/eina_list.c b/legacy/eina/src/lib/eina_list.c index d1f247fcdc..4ad817b545 100644 --- a/legacy/eina/src/lib/eina_list.c +++ b/legacy/eina/src/lib/eina_list.c @@ -1038,7 +1038,7 @@ eina_list_reverse(Eina_List *list) * @endcode */ EAPI Eina_List * -eina_list_sort(Eina_List *list, unsigned int size, int (*func)(void *, void *)) +eina_list_sort(Eina_List *list, unsigned int size, Eina_Compare_Cb func) { Eina_List* last; unsigned int list_number; diff --git a/legacy/eina/src/tests/Makefile.am b/legacy/eina/src/tests/Makefile.am index 8ac07448f1..65708ba15f 100644 --- a/legacy/eina/src/tests/Makefile.am +++ b/legacy/eina/src/tests/Makefile.am @@ -84,6 +84,7 @@ bench_PROGRAMS = eina_bench eina_bench_SOURCES = \ eina_bench.c \ +eina_bench_sort.c \ eina_bench_hash.c \ eina_bench_stringshare.c \ eina_bench_convert.c \ diff --git a/legacy/eina/src/tests/eina_bench.c b/legacy/eina/src/tests/eina_bench.c index 2e8ba3e9fe..4f231a6c76 100644 --- a/legacy/eina/src/tests/eina_bench.c +++ b/legacy/eina/src/tests/eina_bench.c @@ -35,6 +35,7 @@ static const Eina_Benchmark_Case etc[] = { { "Array vs List vs Inlist", eina_bench_array }, { "Stringshare", eina_bench_stringshare }, { "Convert", eina_bench_convert }, + { "Sort", eina_bench_sort }, { NULL, NULL } }; diff --git a/legacy/eina/src/tests/eina_bench.h b/legacy/eina/src/tests/eina_bench.h index 25df93dd71..685fb2cb0a 100644 --- a/legacy/eina/src/tests/eina_bench.h +++ b/legacy/eina/src/tests/eina_bench.h @@ -25,6 +25,7 @@ void eina_bench_hash(Eina_Benchmark *bench); void eina_bench_array(Eina_Benchmark *bench); void eina_bench_stringshare(Eina_Benchmark *bench); void eina_bench_convert(Eina_Benchmark *bench); +void eina_bench_sort(Eina_Benchmark *bench); /* Specific benchmark. */ void eina_bench_e17(void); diff --git a/legacy/eina/src/tests/eina_bench_sort.c b/legacy/eina/src/tests/eina_bench_sort.c new file mode 100644 index 0000000000..d55f583bed --- /dev/null +++ b/legacy/eina/src/tests/eina_bench_sort.c @@ -0,0 +1,236 @@ +/* EINA - EFL data type library + * Copyright (C) 2008 Cedric Bail + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; + * if not, see . + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include + +#ifdef EINA_BENCH_HAVE_GLIB +#include +#endif + +#ifdef EINA_BENCH_HAVE_EVAS +#include +#endif + +#ifdef EINA_BENCH_HAVE_ECORE +#include +#include +#endif + +#include "eina_bench.h" +#include "eina_list.h" +#include "eina_convert.h" + +static int +_eina_cmp_str(const char *a, const char *b) +{ + return strcmp(a, b); +} + +static void +eina_bench_sort_eina(int request) +{ + Eina_List *list = NULL; + int i; + + eina_list_init(); + + srand(time(NULL)); + + for (i = 0; i < request; ++i) + { + char buffer[10]; + + eina_convert_itoa(rand() % request, buffer); + + list = eina_list_prepend(list, strdup(buffer)); + } + + list = eina_list_sort(list, -1, EINA_COMPARE_CB(_eina_cmp_str)); + + while (list) + { + free(eina_list_data(list)); + list = eina_list_remove_list(list, list); + } + + eina_list_shutdown(); +} + +#ifdef EINA_BENCH_HAVE_EVAS +static void +eina_bench_sort_evas(int request) +{ + Evas_List *list = NULL; + int i; + + evas_init(); + + srand(time(NULL)); + + for (i = 0; i < request; ++i) + { + char buffer[10]; + + eina_convert_itoa(rand() % request, buffer); + + list = evas_list_prepend(list, strdup(buffer)); + } + + list = evas_list_sort(list, -1, (void*) _eina_cmp_str); + + while (list) + { + free(evas_list_data(list)); + list = evas_list_remove_list(list, list); + } + + evas_shutdown(); +} +#endif + +#ifdef EINA_BENCH_HAVE_GLIB +static void +eina_bench_sort_glist(int request) +{ + GList *list = NULL; + int i; + + srand(time(NULL)); + + for (i = 0; i < request; ++i) + { + char buffer[10]; + + eina_convert_itoa(rand() % request, buffer); + + list = g_list_prepend(list, strdup(buffer)); + } + + list = g_list_sort(list, (void*) _eina_cmp_str); + + while (list) + { + free(list->data); + list = g_list_delete_link(list, list); + } +} +#endif + +#ifdef EINA_BENCH_HAVE_ECORE +static void +eina_bench_sort_ecore_default(int request) +{ + Ecore_List *list = NULL; + int i; + + ecore_init(); + list = ecore_list_new(); + ecore_list_free_cb_set(list, free); + + for (i = 0; i < request; ++i) + { + char buffer[10]; + + eina_convert_itoa(rand() % request, buffer); + + ecore_list_prepend(list, strdup(buffer)); + } + + ecore_list_sort(list, ECORE_COMPARE_CB(_eina_cmp_str), 0); + + ecore_list_destroy(list); + + ecore_shutdown(); +} + +static void +eina_bench_sort_ecore_merge(int request) +{ + Ecore_List *list = NULL; + int i; + + ecore_init(); + list = ecore_list_new(); + ecore_list_free_cb_set(list, free); + + for (i = 0; i < request; ++i) + { + char buffer[10]; + + eina_convert_itoa(rand() % request, buffer); + + ecore_list_prepend(list, strdup(buffer)); + } + + ecore_list_mergesort(list, ECORE_COMPARE_CB(_eina_cmp_str), 0); + + ecore_list_destroy(list); + + ecore_shutdown(); +} + +static void +eina_bench_sort_ecore_heap(int request) +{ + Ecore_List *list = NULL; + int i; + + ecore_init(); + list = ecore_list_new(); + ecore_list_free_cb_set(list, free); + + for (i = 0; i < request; ++i) + { + char buffer[10]; + + eina_convert_itoa(rand() % request, buffer); + + ecore_list_prepend(list, strdup(buffer)); + } + + ecore_list_heapsort(list, ECORE_COMPARE_CB(_eina_cmp_str), 0); + + ecore_list_destroy(list); + + ecore_shutdown(); +} +#endif + +void eina_bench_sort(Eina_Benchmark *bench) +{ + eina_benchmark_register(bench, "eina", EINA_BENCHMARK(eina_bench_sort_eina), 10, 10000, 100); +#ifdef EINA_BENCH_HAVE_GLIB + eina_benchmark_register(bench, "glist", EINA_BENCHMARK(eina_bench_sort_glist), 10, 10000, 100); +#endif +#ifdef EINA_BENCH_HAVE_ECORE + eina_benchmark_register(bench, "ecore", EINA_BENCHMARK(eina_bench_sort_ecore_default), 10, 10000, 100); + eina_benchmark_register(bench, "ecore-merge", EINA_BENCHMARK(eina_bench_sort_ecore_merge), 10, 10000, 100); + eina_benchmark_register(bench, "ecore-heap", EINA_BENCHMARK(eina_bench_sort_ecore_heap), 10, 10000, 100); +#endif +#ifdef EINA_BENCH_HAVE_EVAS + eina_benchmark_register(bench, "evas", EINA_BENCHMARK(eina_bench_sort_evas), 10, 10000, 100); +#endif +} + + +