jpeg pushed a commit to branch master. http://git.enlightenment.org/core/efl.git/commit/?id=6e294890546b14cc1bfd6839a07cde5ce8fb7e12
commit 6e294890546b14cc1bfd6839a07cde5ce8fb7e12 Author: Jean-Philippe Andre <jp.an...@samsung.com> Date: Mon Jun 29 17:51:42 2015 +0900 Edje: Use bsearch() to find filters as fast as possible edje_cc ensures that the filters are in order by name --- src/lib/edje/edje_calc.c | 37 ++++++++++++++++++++++++------------- src/lib/edje/edje_private.h | 2 +- 2 files changed, 25 insertions(+), 14 deletions(-) diff --git a/src/lib/edje/edje_calc.c b/src/lib/edje/edje_calc.c index b45de76..bf0e182 100644 --- a/src/lib/edje/edje_calc.c +++ b/src/lib/edje/edje_calc.c @@ -2405,26 +2405,37 @@ _edje_part_recalc_single_map(Edje *ed, EINA_COW_CALC_MAP_END(params, params_write); } +static int +_filter_bsearch_cmp(const void *a, const void *b) +{ + const Edje_Gfx_Filter *filter = b; + const char *key = a; + + return strcmp(key, filter->name); +} + static inline const char * _edje_filter_get(Edje *ed, Edje_Part_Description_Spec_Filter *filter) { - int k; if (!filter->code) return NULL; if (EINA_UNLIKELY(!filter->checked_data)) { - // FIXME: bisect search instead of linear search + Edje_Gfx_Filter *found; + filter->checked_data = EINA_TRUE; - if (ed->file->filter_dir) - for (k = 0; k <= ed->file->filter_dir->filters_count; k++) - { - if (!strcmp(filter->code, ed->file->filter_dir->filters[k].name)) - { - filter->name = ed->file->filter_dir->filters[k].name; - filter->code = ed->file->filter_dir->filters[k].script; - filter->no_free = EINA_TRUE; - return filter->code; - } - } + if (!ed->file->filter_dir) + return filter->code; + + found = bsearch(filter->code, &(ed->file->filter_dir->filters[0]), + ed->file->filter_dir->filters_count, + sizeof(Edje_Gfx_Filter), _filter_bsearch_cmp); + if (found) + { + filter->name = found->name; + filter->code = found->script; + filter->no_free = EINA_TRUE; + return filter->code; + } } return filter->code; } diff --git a/src/lib/edje/edje_private.h b/src/lib/edje/edje_private.h index bc53874..e3c55fe 100644 --- a/src/lib/edje/edje_private.h +++ b/src/lib/edje/edje_private.h @@ -731,7 +731,7 @@ struct _Edje_Gfx_Filter struct _Edje_Gfx_Filter_Directory { - Edje_Gfx_Filter *filters; /* array */ + Edje_Gfx_Filter *filters; /* sorted array (by strcmp() on name) */ int filters_count; }; --