jpeg pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=9a83113b9f2864d3e9f4c133d6cb61330ba8c454

commit 9a83113b9f2864d3e9f4c133d6cb61330ba8c454
Author: Jean-Philippe Andre <jp.an...@samsung.com>
Date:   Mon Feb 20 17:59:50 2017 +0900

    evas: Optimize out more calls to efl_isa
    
    In relative smart move, we only need to check once that the object
    is indeed a valid smart object. This drops the call count from ~1.02M
    to ~785k.
    
    @optimization
---
 src/lib/evas/canvas/evas_object_smart.c         | 46 +++++++++++++++----------
 src/lib/evas/canvas/evas_object_smart_clipped.c |  8 ++---
 src/lib/evas/include/evas_private.h             |  2 +-
 3 files changed, 31 insertions(+), 25 deletions(-)

diff --git a/src/lib/evas/canvas/evas_object_smart.c 
b/src/lib/evas/canvas/evas_object_smart.c
index 0b3cb69..5279089 100644
--- a/src/lib/evas/canvas/evas_object_smart.c
+++ b/src/lib/evas/canvas/evas_object_smart.c
@@ -640,17 +640,12 @@ _efl_canvas_group_efl_object_destructor(Eo *eo_obj, 
Evas_Smart_Data *o)
      }
 }
 
-EAPI void
-evas_object_smart_move_children_relative(Eo *eo_obj, Evas_Coord dx, Evas_Coord 
dy)
+static inline void
+_evas_object_smart_move_relative_internal(Evas_Smart_Data *o, Evas_Coord dx, 
Evas_Coord dy)
 {
    Evas_Object_Protected_Data *child;
-   const Eina_Inlist *lst;
-
-   if ((dx == 0) && (dy == 0)) return;
-   if (!efl_isa(eo_obj, MY_CLASS)) return;
 
-   lst = evas_object_smart_members_get_direct(eo_obj);
-   EINA_INLIST_FOREACH(lst, child)
+   EINA_INLIST_FOREACH(o->contained, child)
      {
         Evas_Coord orig_x, orig_y;
 
@@ -662,6 +657,30 @@ evas_object_smart_move_children_relative(Eo *eo_obj, 
Evas_Coord dx, Evas_Coord d
      }
 }
 
+EAPI void
+evas_object_smart_move_children_relative(Eo *eo_obj, Evas_Coord dx, Evas_Coord 
dy)
+{
+   Evas_Smart_Data *o;
+
+   if ((dx == 0) && (dy == 0)) return;
+   if (!efl_isa(eo_obj, MY_CLASS)) return;
+   o = efl_data_scope_get(eo_obj, MY_CLASS);
+   _evas_object_smart_move_relative_internal(o, dx, dy);
+}
+
+void
+_evas_object_smart_clipped_smart_move_internal(Evas_Object *eo_obj, Evas_Coord 
x, Evas_Coord y)
+{
+   Evas_Smart_Data *o = efl_data_scope_get(eo_obj, EFL_CANVAS_GROUP_CLASS);
+   Evas_Coord orig_x, orig_y;
+
+   orig_x = o->x;
+   orig_y = o->y;
+   o->x = x;
+   o->y = y;
+   _evas_object_smart_move_relative_internal(o, x - orig_x, y - orig_y);
+}
+
 EOLIAN static void
 _efl_canvas_group_group_add(Eo *eo_obj, Evas_Smart_Data *o EINA_UNUSED)
 {
@@ -957,17 +976,6 @@ _evas_canvas_smart_objects_calculate_count_get(Eo *eo_e 
EINA_UNUSED, Evas_Public
    return e->smart_calc_count;
 }
 
-void
-_evas_object_smart_xy_update(Eo *eo_obj, Evas_Coord *px, Evas_Coord *py,
-                             Evas_Coord x, Evas_Coord y)
-{
-   EVAS_OBJECT_SMART_GET_OR_RETURN(eo_obj);
-   *px = o->x;
-   *py = o->y;
-   o->x = x;
-   o->y = y;
-}
-
 /**
  * Call calculate() on all smart objects that need_recalculate.
  *
diff --git a/src/lib/evas/canvas/evas_object_smart_clipped.c 
b/src/lib/evas/canvas/evas_object_smart_clipped.c
index a4b96d3..6275ef6 100644
--- a/src/lib/evas/canvas/evas_object_smart_clipped.c
+++ b/src/lib/evas/canvas/evas_object_smart_clipped.c
@@ -85,10 +85,8 @@ _efl_canvas_group_clipped_efl_canvas_group_group_del(Eo 
*eo_obj, Evas_Object_Sma
 static void
 evas_object_smart_clipped_smart_move(Evas_Object *eo_obj, Evas_Coord x, 
Evas_Coord y)
 {
-   Evas_Coord orig_x, orig_y;
-
-   _evas_object_smart_xy_update(eo_obj, &orig_x, &orig_y, x, y);
-   evas_object_smart_move_children_relative(eo_obj, x - orig_x, y - orig_y);
+   if (!efl_isa(eo_obj, EFL_CANVAS_GROUP_CLASS)) return;
+   _evas_object_smart_clipped_smart_move_internal(eo_obj, x, y);
 }
 
 EOLIAN static void
@@ -97,7 +95,7 @@ _efl_canvas_group_clipped_efl_gfx_position_set(Eo *eo_obj, 
Evas_Object_Smart_Cli
    if (_evas_object_intercept_call(eo_obj, EVAS_OBJECT_INTERCEPT_CB_MOVE, 0, 
x, y))
      return;
 
-   evas_object_smart_clipped_smart_move(eo_obj, x, y);
+   _evas_object_smart_clipped_smart_move_internal(eo_obj, x, y);
    efl_gfx_position_set(efl_super(eo_obj, MY_CLASS), x, y);
 }
 
diff --git a/src/lib/evas/include/evas_private.h 
b/src/lib/evas/include/evas_private.h
index 0aad234..8b44812 100644
--- a/src/lib/evas/include/evas_private.h
+++ b/src/lib/evas/include/evas_private.h
@@ -1679,7 +1679,7 @@ void evas_object_smart_render_cache_set(Evas_Object 
*eo_obj, void *data);
 
 const Eina_Inlist *evas_object_smart_members_get_direct(const Evas_Object 
*obj);
 void _efl_canvas_group_group_members_all_del(Evas_Object *eo_obj);
-void _evas_object_smart_xy_update(Eo *eo_obj, Evas_Coord *px, Evas_Coord *py, 
Evas_Coord x, Evas_Coord y);
+void _evas_object_smart_clipped_smart_move_internal(Evas_Object *eo_obj, 
Evas_Coord x, Evas_Coord y);
 void evas_call_smarts_calculate(Evas *e);
 void evas_object_smart_bounding_box_update(Evas_Object *eo_obj, 
Evas_Object_Protected_Data *obj);
 void evas_object_smart_need_bounding_box_update(Evas_Object *eo_obj, 
Evas_Smart_Data *o, Evas_Object_Protected_Data *obj);

-- 


Reply via email to