1 /* EINA - EFL data type library
2 * Copyright (C) 2008 Cedric Bail
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library;
16 * if not, see <http://www.gnu.org/licenses/>.
27 #ifdef EINA_BENCH_HAVE_GLIB
31 #include "Evas_Data.h"
32 #include "Ecore_Data.h"
34 #include "eina_bench.h"
35 #include "eina_array.h"
36 #include "eina_list.h"
37 #include "eina_inlist.h"
38 #include "eina_main.h"
40 typedef struct _Eina_Bench_Object Eina_Bench_Object;
41 struct _Eina_Bench_Object
50 static Eina_Bool keep(void *data, __UNUSED__ void *gdata)
52 Eina_Bench_Object *bo = data;
54 if (bo->keep == EINA_TRUE)
62 eina_bench_array_4evas_render_inline(int request)
65 Eina_Bench_Object *ebo;
66 Eina_Array_Iterator it;
74 array = eina_array_new(64);
76 for (i = 0; i < 1000; ++i)
78 for (j = 0; j < (unsigned int)request; ++j)
80 ebo = malloc(sizeof (Eina_Bench_Object));
84 ebo->keep = rand() < (RAND_MAX / 2) ? EINA_TRUE : EINA_FALSE;
86 eina_array_push(array, ebo);
91 EINA_ARRAY_ITER_NEXT(array, j, ebo, it)
94 eina_array_clean(array);
97 eina_array_remove(array, keep, NULL);
99 EINA_ARRAY_ITER_NEXT(array, j, ebo, it)
100 ebo->keep = rand() < (RAND_MAX / 2) ? ebo->keep : EINA_FALSE;
103 EINA_ARRAY_ITER_NEXT(array, j, ebo, it)
106 eina_array_free(array);
112 eina_iterator_ebo_free(__UNUSED__ const Eina_Array *array,
113 Eina_Bench_Object *ebo, __UNUSED__ void *fdata)
120 eina_iterator_ebo_rand(__UNUSED__ const void *container,
121 Eina_Bench_Object *ebo, __UNUSED__ void *fdata)
123 ebo->keep = rand() < (RAND_MAX / 2) ? ebo->keep : EINA_FALSE;
128 eina_bench_array_4evas_render_iterator(int request)
131 Eina_Bench_Object *ebo;
140 array = eina_array_new(64);
142 for (i = 0; i < 1000; ++i)
144 for (j = 0; j < (unsigned int)request; ++j)
146 ebo = malloc(sizeof (Eina_Bench_Object));
150 ebo->keep = rand() < (RAND_MAX / 2) ? EINA_TRUE : EINA_FALSE;
152 eina_array_push(array, ebo);
157 it = eina_array_iterator_new(array);
158 eina_iterator_foreach(it, EINA_EACH_CB(eina_iterator_ebo_free), NULL);
159 eina_iterator_free(it);
161 eina_array_clean(array);
163 else if (i % 30 == 0)
164 eina_array_remove(array, keep, NULL);
166 it = eina_array_iterator_new(array);
167 eina_iterator_foreach(it, EINA_EACH_CB(eina_iterator_ebo_rand), NULL);
168 eina_iterator_free(it);
171 it = eina_array_iterator_new(array);
172 eina_iterator_foreach(it, EINA_EACH_CB(eina_iterator_ebo_free), NULL);
173 eina_iterator_free(it);
175 eina_array_free(array);
181 eina_bench_list_4evas_render(int request)
183 Eina_List *list = NULL;
185 Eina_Bench_Object *ebo;
191 for (i = 0; i < 1000; ++i)
193 for (j = 0; j < request; ++j)
195 ebo = malloc(sizeof (Eina_Bench_Object));
199 ebo->keep = rand() < (RAND_MAX / 2) ? EINA_TRUE : EINA_FALSE;
201 list = eina_list_prepend(list, ebo);
207 free(eina_list_data_get(list));
208 list = eina_list_remove_list(list, list);
210 else if (i % 30 == 0)
215 Eina_List *reminder = tmp;
217 ebo = eina_list_data_get(reminder);
218 tmp = eina_list_next(tmp);
220 if (ebo->keep == EINA_FALSE)
222 list = eina_list_remove_list(list, reminder);
228 for (tmp = list; tmp; tmp = eina_list_next(tmp))
230 ebo = eina_list_data_get(tmp);
232 ebo->keep = rand() < (RAND_MAX / 2) ? ebo->keep : EINA_FALSE;
238 free(eina_list_data_get(list));
239 list = eina_list_remove_list(list, list);
246 eina_bench_list_4evas_render_iterator(int request)
248 Eina_List *list = NULL;
250 Eina_Bench_Object *ebo;
257 for (i = 0; i < 1000; ++i)
259 for (j = 0; j < request; ++j)
261 ebo = malloc(sizeof (Eina_Bench_Object));
265 ebo->keep = rand() < (RAND_MAX / 2) ? EINA_TRUE : EINA_FALSE;
267 list = eina_list_prepend(list, ebo);
273 free(eina_list_data_get(list));
274 list = eina_list_remove_list(list, list);
276 else if (i % 30 == 0)
281 Eina_List *reminder = tmp;
283 ebo = eina_list_data_get(reminder);
284 tmp = eina_list_next(tmp);
286 if (ebo->keep == EINA_FALSE)
288 list = eina_list_remove_list(list, reminder);
294 it = eina_list_iterator_new(list);
295 eina_iterator_foreach(it, EINA_EACH_CB(eina_iterator_ebo_rand), NULL);
296 eina_iterator_free(it);
301 free(eina_list_data_get(list));
302 list = eina_list_remove_list(list, list);
309 eina_bench_inlist_4evas_render(int request)
311 Eina_Inlist *head = NULL;
313 Eina_Bench_Object *ebo;
317 for (i = 0; i < 1000; ++i)
319 for (j = 0; j < request; ++j)
321 ebo = malloc(sizeof (Eina_Bench_Object));
325 ebo->keep = rand() < (RAND_MAX / 2) ? EINA_TRUE : EINA_FALSE;
327 head = eina_inlist_prepend(head, EINA_INLIST_GET(ebo));
337 else if (i % 30 == 0)
342 ebo = (Eina_Bench_Object *)tmp;
345 if (ebo->keep == EINA_FALSE)
347 head = eina_inlist_remove(head, EINA_INLIST_GET(ebo));
353 EINA_INLIST_FOREACH(head, ebo)
354 ebo->keep = rand() < (RAND_MAX / 2) ? ebo->keep : EINA_FALSE;
366 eina_bench_inlist_4evas_render_iterator(int request)
368 Eina_Inlist *head = NULL;
370 Eina_Bench_Object *ebo;
375 for (i = 0; i < 1000; ++i)
377 for (j = 0; j < request; ++j)
379 ebo = malloc(sizeof (Eina_Bench_Object));
383 ebo->keep = rand() < (RAND_MAX / 2) ? EINA_TRUE : EINA_FALSE;
385 head = eina_inlist_prepend(head, EINA_INLIST_GET(ebo));
395 else if (i % 30 == 0)
400 ebo = (Eina_Bench_Object *)tmp;
403 if (ebo->keep == EINA_FALSE)
405 head = eina_inlist_remove(head, EINA_INLIST_GET(ebo));
411 it = eina_inlist_iterator_new(head);
412 eina_iterator_foreach(it, EINA_EACH_CB(eina_iterator_ebo_rand), NULL);
413 eina_iterator_free(it);
424 #ifdef EINA_BENCH_HAVE_GLIB
426 eina_bench_glist_4evas_render(int request)
430 Eina_Bench_Object *ebo;
434 for (i = 0; i < 1000; ++i)
436 for (j = 0; j < request; ++j)
438 ebo = malloc(sizeof (Eina_Bench_Object));
442 ebo->keep = rand() < (RAND_MAX / 2) ? EINA_TRUE : EINA_FALSE;
444 list = g_list_prepend(list, ebo);
451 list = g_list_delete_link(list, list);
453 else if (i % 30 == 0)
458 GList *reminder = tmp;
460 ebo = reminder->data;
461 tmp = g_list_next(tmp);
463 if (ebo->keep == EINA_FALSE)
465 list = g_list_delete_link(list, reminder);
471 for (tmp = list; tmp; tmp = g_list_next(tmp))
475 ebo->keep = rand() < (RAND_MAX / 2) ? ebo->keep : EINA_FALSE;
482 list = g_list_delete_link(list, list);
487 eina_bench_gptrarray_4evas_render(int request)
489 GPtrArray *array = NULL;
490 Eina_Bench_Object *ebo;
494 array = g_ptr_array_new();
496 for (i = 0; i < 1000; ++i)
498 for (j = 0; j < (unsigned int)request; ++j)
500 ebo = malloc(sizeof (Eina_Bench_Object));
504 ebo->keep = rand() < (RAND_MAX / 2) ? EINA_TRUE : EINA_FALSE;
506 g_ptr_array_add(array, ebo);
511 for (j = 0; j < array->len; ++j)
512 free(g_ptr_array_index(array, j));
513 g_ptr_array_remove_range(array, 0, array->len);
515 else if (i % 30 == 0)
516 for (j = 0; j < array->len; )
518 ebo = g_ptr_array_index(array, j);
520 if (ebo->keep == EINA_FALSE)
521 free(g_ptr_array_remove_index_fast(array, j));
526 for (j = 0; j < array->len; ++j)
528 ebo = g_ptr_array_index(array, j);
530 ebo->keep = rand() < (RAND_MAX / 2) ? ebo->keep : EINA_FALSE;
534 for (j = 0; j < array->len; ++j)
535 free(g_ptr_array_index(array, j));
536 g_ptr_array_free(array, TRUE);
541 eina_bench_evas_list_4evas_render(int request)
543 Evas_List *list = NULL;
545 Eina_Bench_Object *ebo;
549 for (i = 0; i < 1000; ++i)
551 for (j = 0; j < request; ++j)
553 ebo = malloc(sizeof (Eina_Bench_Object));
557 ebo->keep = rand() < (RAND_MAX / 2) ? EINA_TRUE : EINA_FALSE;
559 list = evas_list_prepend(list, ebo);
565 free(evas_list_data(list));
566 list = evas_list_remove_list(list, list);
568 else if (i % 30 == 0)
573 Evas_List *reminder = tmp;
575 ebo = evas_list_data(reminder);
576 tmp = evas_list_next(tmp);
578 if (ebo->keep == EINA_FALSE)
580 list = evas_list_remove_list(list, reminder);
586 for (tmp = list; tmp; tmp = evas_list_next(tmp))
588 ebo = evas_list_data(tmp);
590 ebo->keep = rand() < (RAND_MAX / 2) ? ebo->keep : EINA_FALSE;
596 free(evas_list_data(list));
597 list = evas_list_remove_list(list, list);
602 _eina_ecore_for_each_remove(void *value, void *user_data)
604 Eina_Bench_Object *ebo = value;
605 Ecore_List *list = user_data;
607 if (ebo->keep == EINA_FALSE)
608 ecore_list_remove_destroy(list);
612 _eina_ecore_for_each_rand(void *value, __UNUSED__ void *user_data)
614 Eina_Bench_Object *ebo = value;
616 ebo->keep = rand() < (RAND_MAX / 2) ? ebo->keep : EINA_FALSE;
620 eina_bench_ecore_list_4evas_render(int request)
622 Ecore_List *list = NULL;
623 Eina_Bench_Object *ebo;
627 list = ecore_list_new();
628 ecore_list_free_cb_set(list, free);
630 for (i = 0; i < 1000; ++i)
632 for (j = 0; j < request; ++j)
634 ebo = malloc(sizeof (Eina_Bench_Object));
638 ebo->keep = rand() < (RAND_MAX / 2) ? EINA_TRUE : EINA_FALSE;
640 ecore_list_prepend(list, ebo);
644 ecore_list_clear(list);
645 else if (i % 30 == 0)
646 ecore_list_for_each(list, _eina_ecore_for_each_remove, list);
648 ecore_list_for_each(list, _eina_ecore_for_each_rand, list);
651 ecore_list_destroy(list);
654 void eina_bench_array(Eina_Benchmark *bench)
656 eina_benchmark_register(bench, "array-inline",
658 eina_bench_array_4evas_render_inline), 200,
660 eina_benchmark_register(bench, "array-iterator",
662 eina_bench_array_4evas_render_iterator), 200,
664 eina_benchmark_register(bench, "list",
666 eina_bench_list_4evas_render), 200,
668 eina_benchmark_register(bench, "list-iterator",
670 eina_bench_list_4evas_render_iterator), 200,
672 eina_benchmark_register(bench, "inlist",
674 eina_bench_inlist_4evas_render), 200,
676 eina_benchmark_register(bench, "inlist-iterator",
678 eina_bench_inlist_4evas_render_iterator), 200,
680 #ifdef EINA_BENCH_HAVE_GLIB
681 eina_benchmark_register(bench, "glist",
683 eina_bench_glist_4evas_render), 200,
685 eina_benchmark_register(bench, "gptrarray",
687 eina_bench_gptrarray_4evas_render), 200,
690 eina_benchmark_register(bench, "evas",
692 eina_bench_evas_list_4evas_render), 200,
694 eina_benchmark_register(bench, "ecore",
696 eina_bench_ecore_list_4evas_render), 200,