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;
 };
 

-- 


Reply via email to