efl
698 строк · 17.3 Кб
1/* EINA - EFL data type library
2* Copyright (C) 2008 Cedric Bail
3*
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.
8*
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.
13*
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/>.
17*/
18
19#ifdef HAVE_CONFIG_H20# include "config.h"21#endif22
23#include <stdlib.h>24#include <stdio.h>25#include <time.h>26
27#ifdef EINA_BENCH_HAVE_GLIB28# include <glib.h>29#endif30
31#include "Evas_Data.h"32#include "Ecore_Data.h"33
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"39
40typedef struct _Eina_Bench_Object Eina_Bench_Object;41struct _Eina_Bench_Object42{
43EINA_INLIST;44
45void *somewhere;46int data;47Eina_Bool keep;48};49
50static Eina_Bool keep(void *data, EINA_UNUSED void *gdata)51{
52Eina_Bench_Object *bo = data;53
54if (bo->keep == EINA_TRUE)55return EINA_TRUE;56
57free(bo);58return EINA_FALSE;59}
60
61static void62eina_bench_array_4evas_render_inline(int request)63{
64Eina_Array *array;65Eina_Bench_Object *ebo;66Eina_Array_Iterator it;67unsigned int i;68unsigned int j;69
70eina_init();71
72array = eina_array_new(64);73
74for (i = 0; i < 1000; ++i)75{76for (j = 0; j < (unsigned int)request; ++j)77{78ebo = malloc(sizeof (Eina_Bench_Object));79if (!ebo)80continue;81
82ebo->keep = rand() < (RAND_MAX / 2) ? EINA_TRUE : EINA_FALSE;83
84eina_array_push(array, ebo);85}86
87if (i == 500)88{89EINA_ARRAY_ITER_NEXT(array, j, ebo, it) free(ebo);90eina_array_clean(array);91}92else if ((i % 30) == 0)93{94eina_array_remove(array, keep, NULL);95}96
97EINA_ARRAY_ITER_NEXT(array, j, ebo, it)98ebo->keep = rand() < (RAND_MAX / 2) ? ebo->keep : EINA_FALSE;99}100
101EINA_ARRAY_ITER_NEXT(array, j, ebo, it)102free(ebo);103
104eina_array_free(array);105
106eina_shutdown();107}
108
109static Eina_Bool110eina_iterator_ebo_free(EINA_UNUSED const Eina_Array *array,111Eina_Bench_Object *ebo, EINA_UNUSED void *fdata)112{
113free(ebo);114return EINA_TRUE;115}
116
117static Eina_Bool118eina_iterator_ebo_rand(EINA_UNUSED const void *container,119Eina_Bench_Object *ebo, EINA_UNUSED void *fdata)120{
121ebo->keep = rand() < (RAND_MAX / 2) ? ebo->keep : EINA_FALSE;122return EINA_TRUE;123}
124
125static void126eina_bench_array_4evas_render_iterator(int request)127{
128Eina_Array *array;129Eina_Bench_Object *ebo;130Eina_Iterator *it;131unsigned int i;132unsigned int j;133
134eina_init();135
136array = eina_array_new(64);137
138for (i = 0; i < 1000; ++i)139{140for (j = 0; j < (unsigned int)request; ++j)141{142ebo = malloc(sizeof (Eina_Bench_Object));143if (!ebo)144continue;145
146ebo->keep = rand() < (RAND_MAX / 2) ? EINA_TRUE : EINA_FALSE;147
148eina_array_push(array, ebo);149}150
151if (i == 500)152{153it = eina_array_iterator_new(array);154eina_iterator_foreach(it, EINA_EACH_CB(eina_iterator_ebo_free), NULL);155eina_iterator_free(it);156
157eina_array_clean(array);158}159else if ((i % 30) == 0)160{161eina_array_remove(array, keep, NULL);162}163
164it = eina_array_iterator_new(array);165eina_iterator_foreach(it, EINA_EACH_CB(eina_iterator_ebo_rand), NULL);166eina_iterator_free(it);167}168
169it = eina_array_iterator_new(array);170eina_iterator_foreach(it, EINA_EACH_CB(eina_iterator_ebo_free), NULL);171eina_iterator_free(it);172
173eina_array_free(array);174
175eina_shutdown();176}
177
178static void179eina_bench_list_4evas_render(int request)180{
181Eina_List *list = NULL;182Eina_List *tmp;183Eina_Bench_Object *ebo;184int i;185int j;186
187eina_init();188
189for (i = 0; i < 1000; ++i)190{191for (j = 0; j < request; ++j)192{193ebo = malloc(sizeof (Eina_Bench_Object));194if (!ebo)195continue;196
197ebo->keep = rand() < (RAND_MAX / 2) ? EINA_TRUE : EINA_FALSE;198
199list = eina_list_prepend(list, ebo);200}201
202if (i == 500)203while (list)204{205free(eina_list_data_get(list));206list = eina_list_remove_list(list, list);207}208else if ((i % 30) == 0)209{210tmp = list;211while (tmp)212{213Eina_List *reminder = tmp;214
215ebo = eina_list_data_get(reminder);216tmp = eina_list_next(tmp);217
218if (ebo->keep == EINA_FALSE)219{220list = eina_list_remove_list(list, reminder);221free(ebo);222}223}224}225
226for (tmp = list; tmp; tmp = eina_list_next(tmp))227{228ebo = eina_list_data_get(tmp);229
230ebo->keep = rand() < (RAND_MAX / 2) ? ebo->keep : EINA_FALSE;231}232}233
234while (list)235{236free(eina_list_data_get(list));237list = eina_list_remove_list(list, list);238}239
240eina_shutdown();241}
242
243static void244eina_bench_list_4evas_render_iterator(int request)245{
246Eina_List *list = NULL;247Eina_List *tmp;248Eina_Bench_Object *ebo;249Eina_Iterator *it;250int i;251int j;252
253eina_init();254
255for (i = 0; i < 1000; ++i)256{257for (j = 0; j < request; ++j)258{259ebo = malloc(sizeof (Eina_Bench_Object));260if (!ebo)261continue;262
263ebo->keep = rand() < (RAND_MAX / 2) ? EINA_TRUE : EINA_FALSE;264
265list = eina_list_prepend(list, ebo);266}267
268if (i == 500)269while (list)270{271free(eina_list_data_get(list));272list = eina_list_remove_list(list, list);273}274else if ((i % 30) == 0)275{276tmp = list;277while (tmp)278{279Eina_List *reminder = tmp;280
281ebo = eina_list_data_get(reminder);282tmp = eina_list_next(tmp);283
284if (ebo->keep == EINA_FALSE)285{286list = eina_list_remove_list(list, reminder);287free(ebo);288}289}290}291
292it = eina_list_iterator_new(list);293eina_iterator_foreach(it, EINA_EACH_CB(eina_iterator_ebo_rand), NULL);294eina_iterator_free(it);295}296
297while (list)298{299free(eina_list_data_get(list));300list = eina_list_remove_list(list, list);301}302
303eina_shutdown();304}
305
306static void307eina_bench_inlist_4evas_render(int request)308{
309Eina_Inlist *head = NULL;310Eina_Inlist *tmp;311Eina_Bench_Object *ebo;312int i;313int j;314
315for (i = 0; i < 1000; ++i)316{317for (j = 0; j < request; ++j)318{319ebo = malloc(sizeof (Eina_Bench_Object));320if (!ebo)321continue;322
323ebo->keep = rand() < (RAND_MAX / 2) ? EINA_TRUE : EINA_FALSE;324
325head = eina_inlist_prepend(head, EINA_INLIST_GET(ebo));326}327
328if (i == 500)329while (head)330{331tmp = head;332head = head->next;333free(tmp);334}335else if ((i % 30) == 0)336{337tmp = head;338while(tmp)339{340ebo = (Eina_Bench_Object *)tmp;341
342tmp = tmp->next;343if (ebo->keep == EINA_FALSE)344{345head = eina_inlist_remove(head, EINA_INLIST_GET(ebo));346free(ebo);347}348}349}350
351EINA_INLIST_FOREACH(head, ebo)352ebo->keep = rand() < (RAND_MAX / 2) ? ebo->keep : EINA_FALSE;353}354
355while (head)356{357tmp = head;358head = head->next;359free(tmp);360}361}
362
363static void364eina_bench_inlist_4evas_render_iterator(int request)365{
366Eina_Inlist *head = NULL;367Eina_Inlist *tmp;368Eina_Bench_Object *ebo;369Eina_Iterator *it;370int i;371int j;372
373for (i = 0; i < 1000; ++i)374{375for (j = 0; j < request; ++j)376{377ebo = malloc(sizeof (Eina_Bench_Object));378if (!ebo)379continue;380
381ebo->keep = rand() < (RAND_MAX / 2) ? EINA_TRUE : EINA_FALSE;382
383head = eina_inlist_prepend(head, EINA_INLIST_GET(ebo));384}385
386if (i == 500)387while (head)388{389tmp = head;390head = head->next;391free(tmp);392}393else if ((i % 30) == 0)394{395tmp = head;396while(tmp)397{398ebo = (Eina_Bench_Object *)tmp;399
400tmp = tmp->next;401if (ebo->keep == EINA_FALSE)402{403head = eina_inlist_remove(head, EINA_INLIST_GET(ebo));404free(ebo);405}406}407}408
409it = eina_inlist_iterator_new(head);410eina_iterator_foreach(it, EINA_EACH_CB(eina_iterator_ebo_rand), NULL);411eina_iterator_free(it);412}413
414while (head)415{416tmp = head;417head = head->next;418free(tmp);419}420}
421
422#ifdef EINA_BENCH_HAVE_GLIB423static void424eina_bench_glist_4evas_render(int request)425{
426GList *list = NULL;427GList *tmp;428Eina_Bench_Object *ebo;429int i;430int j;431
432for (i = 0; i < 1000; ++i)433{434for (j = 0; j < request; ++j)435{436ebo = malloc(sizeof (Eina_Bench_Object));437if (!ebo)438continue;439
440ebo->keep = rand() < (RAND_MAX / 2) ? EINA_TRUE : EINA_FALSE;441
442list = g_list_prepend(list, ebo);443}444
445if (i == 500)446while (list)447{448free(list->data);449list = g_list_delete_link(list, list);450}451else if ((i % 30) == 0)452{453tmp = list;454while (tmp)455{456GList *reminder = tmp;457
458ebo = reminder->data;459tmp = g_list_next(tmp);460
461if (ebo->keep == EINA_FALSE)462{463list = g_list_delete_link(list, reminder);464free(ebo);465}466}467}468
469for (tmp = list; tmp; tmp = g_list_next(tmp))470{471ebo = tmp->data;472
473ebo->keep = rand() < (RAND_MAX / 2) ? ebo->keep : EINA_FALSE;474}475}476
477while (list)478{479free(list->data);480list = g_list_delete_link(list, list);481}482}
483
484static void485eina_bench_gptrarray_4evas_render(int request)486{
487GPtrArray *array = NULL;488Eina_Bench_Object *ebo;489unsigned int j;490int i;491
492array = g_ptr_array_new();493
494for (i = 0; i < 1000; ++i)495{496for (j = 0; j < (unsigned int)request; ++j)497{498ebo = malloc(sizeof (Eina_Bench_Object));499if (!ebo)500continue;501
502ebo->keep = rand() < (RAND_MAX / 2) ? EINA_TRUE : EINA_FALSE;503
504g_ptr_array_add(array, ebo);505}506
507if (i == 500)508{509for (j = 0; j < array->len; ++j)510free(g_ptr_array_index(array, j));511g_ptr_array_remove_range(array, 0, array->len);512}513else if ((i % 30) == 0)514for (j = 0; j < array->len; )515{516ebo = g_ptr_array_index(array, j);517
518if (ebo->keep == EINA_FALSE)519free(g_ptr_array_remove_index_fast(array, j));520else521j++;522}523
524for (j = 0; j < array->len; ++j)525{526ebo = g_ptr_array_index(array, j);527
528ebo->keep = rand() < (RAND_MAX / 2) ? ebo->keep : EINA_FALSE;529}530}531
532for (j = 0; j < array->len; ++j)533free(g_ptr_array_index(array, j));534g_ptr_array_free(array, TRUE);535}
536#endif537
538static void539eina_bench_evas_list_4evas_render(int request)540{
541Evas_List *list = NULL;542Evas_List *tmp;543Eina_Bench_Object *ebo;544int i;545int j;546
547for (i = 0; i < 1000; ++i)548{549for (j = 0; j < request; ++j)550{551ebo = malloc(sizeof (Eina_Bench_Object));552if (!ebo)553continue;554
555ebo->keep = rand() < (RAND_MAX / 2) ? EINA_TRUE : EINA_FALSE;556
557list = evas_list_prepend(list, ebo);558}559
560if (i == 500)561while (list)562{563free(evas_list_data(list));564list = evas_list_remove_list(list, list);565}566else if ((i % 30) == 0)567{568tmp = list;569while (tmp)570{571Evas_List *reminder = tmp;572
573ebo = evas_list_data(reminder);574tmp = evas_list_next(tmp);575
576if (ebo->keep == EINA_FALSE)577{578list = evas_list_remove_list(list, reminder);579free(ebo);580}581}582}583
584for (tmp = list; tmp; tmp = evas_list_next(tmp))585{586ebo = evas_list_data(tmp);587
588ebo->keep = rand() < (RAND_MAX / 2) ? ebo->keep : EINA_FALSE;589}590}591
592while (list)593{594free(evas_list_data(list));595list = evas_list_remove_list(list, list);596}597}
598
599static void600_eina_ecore_for_each_remove(void *value, void *user_data)601{
602Eina_Bench_Object *ebo = value;603Ecore_List *list = user_data;604
605if (ebo->keep == EINA_FALSE)606ecore_list_remove_destroy(list);607}
608
609static void610_eina_ecore_for_each_rand(void *value, EINA_UNUSED void *user_data)611{
612Eina_Bench_Object *ebo = value;613
614ebo->keep = rand() < (RAND_MAX / 2) ? ebo->keep : EINA_FALSE;615}
616
617static void618eina_bench_ecore_list_4evas_render(int request)619{
620Ecore_List *list = NULL;621Eina_Bench_Object *ebo;622int i;623int j;624
625list = ecore_list_new();626ecore_list_free_cb_set(list, free);627
628for (i = 0; i < 1000; ++i)629{630for (j = 0; j < request; ++j)631{632ebo = malloc(sizeof (Eina_Bench_Object));633if (!ebo)634continue;635
636ebo->keep = rand() < (RAND_MAX / 2) ? EINA_TRUE : EINA_FALSE;637
638ecore_list_prepend(list, ebo);639}640
641if (i == 500)642ecore_list_clear(list);643else if ((i % 30) == 0)644{645ecore_list_for_each(list, _eina_ecore_for_each_remove, list);646}647
648ecore_list_for_each(list, _eina_ecore_for_each_rand, list);649}650
651ecore_list_destroy(list);652}
653
654void eina_bench_array(Eina_Benchmark *bench)655{
656eina_benchmark_register(bench, "array-inline",657EINA_BENCHMARK(658eina_bench_array_4evas_render_inline), 200,6594000, 100);660eina_benchmark_register(bench, "array-iterator",661EINA_BENCHMARK(662eina_bench_array_4evas_render_iterator), 200,6634000, 100);664eina_benchmark_register(bench, "list",665EINA_BENCHMARK(666eina_bench_list_4evas_render), 200,6674000, 100);668eina_benchmark_register(bench, "list-iterator",669EINA_BENCHMARK(670eina_bench_list_4evas_render_iterator), 200,6714000, 100);672eina_benchmark_register(bench, "inlist",673EINA_BENCHMARK(674eina_bench_inlist_4evas_render), 200,6754000, 100);676eina_benchmark_register(bench, "inlist-iterator",677EINA_BENCHMARK(678eina_bench_inlist_4evas_render_iterator), 200,6794000, 100);680#ifdef EINA_BENCH_HAVE_GLIB681eina_benchmark_register(bench, "glist",682EINA_BENCHMARK(683eina_bench_glist_4evas_render), 200,6844000, 100);685eina_benchmark_register(bench, "gptrarray",686EINA_BENCHMARK(687eina_bench_gptrarray_4evas_render), 200,6884000, 100);689#endif690eina_benchmark_register(bench, "evas",691EINA_BENCHMARK(692eina_bench_evas_list_4evas_render), 200,6934000, 100);694eina_benchmark_register(bench, "ecore",695EINA_BENCHMARK(696eina_bench_ecore_list_4evas_render), 200,697500, 100);698}
699
700