Patchwork [bitbake-devel,11/11] Hob: improve recipe/package selection performance

login
register
mail settings
Submitter Dongxiao Xu
Date March 14, 2012, 9:26 a.m.
Message ID <b2f277bf2d1de5aff3f9ef5be9cd3a9c81897852.1331716896.git.dongxiao.xu@intel.com>
Download mbox | patch
Permalink /patch/23305/
State Accepted
Commit 5ad7c54f4b8739b9ae097c68978093a53f950ed7
Headers show

Comments

Dongxiao Xu - March 14, 2012, 9:26 a.m.
Originally we will send selection chagned notification in each
include_item and exclude_item, which is time cost since these are
recursive functions and we may select hundreds of recipes/packages.

The improvement is to move the notification from include_item and
exclude_item to the place where the two functions are called.
This could greatly improve the selection/deselection speed for recipe
and package lists.

Signed-off-by: Dongxiao Xu <dongxiao.xu@intel.com>
---
 lib/bb/ui/crumbs/hoblistmodel.py         |   10 +++-------
 lib/bb/ui/crumbs/packageselectionpage.py |    1 +
 lib/bb/ui/crumbs/recipeselectionpage.py  |    1 +
 3 files changed, 5 insertions(+), 7 deletions(-)
Joshua Lock - March 14, 2012, 7:37 p.m.
On 14/03/12 02:26, Dongxiao Xu wrote:
> Originally we will send selection chagned notification in each
> include_item and exclude_item, which is time cost since these are
> recursive functions and we may select hundreds of recipes/packages.
>
> The improvement is to move the notification from include_item and
> exclude_item to the place where the two functions are called.
> This could greatly improve the selection/deselection speed for recipe
> and package lists.

Awesome! So instead of sending the change notification for each 
included/excluded item with this change the signal will be sent once 
when a set of changes are made. Right?

>
> Signed-off-by: Dongxiao Xu<dongxiao.xu@intel.com>

Signed-off-by: Joshua Lock <josh@linux.intel.com>

> ---
>   lib/bb/ui/crumbs/hoblistmodel.py         |   10 +++-------
>   lib/bb/ui/crumbs/packageselectionpage.py |    1 +
>   lib/bb/ui/crumbs/recipeselectionpage.py  |    1 +
>   3 files changed, 5 insertions(+), 7 deletions(-)
>
> diff --git a/lib/bb/ui/crumbs/hoblistmodel.py b/lib/bb/ui/crumbs/hoblistmodel.py
> index edd61b5..caf31bc 100644
> --- a/lib/bb/ui/crumbs/hoblistmodel.py
> +++ b/lib/bb/ui/crumbs/hoblistmodel.py
> @@ -216,8 +216,6 @@ class PackageListModel(gtk.TreeStore):
>
>           self[item_path][self.COL_INC] = True
>
> -        self.selection_change_notification()
> -
>           it = self.get_iter(item_path)
>
>           # If user explicitly selects a recipe, all its providing packages are selected.
> @@ -276,8 +274,6 @@ class PackageListModel(gtk.TreeStore):
>
>           self[item_path][self.COL_INC] = False
>
> -        self.selection_change_notification()
> -
>           item_name = self[item_path][self.COL_NAME]
>           item_rdep = self[item_path][self.COL_RDEP]
>           it = self.get_iter(item_path)
> @@ -343,6 +339,7 @@ class PackageListModel(gtk.TreeStore):
>               else:
>                   left.append(pn)
>
> +        self.selection_change_notification()
>           return left
>
>       def get_selected_packages(self):
> @@ -604,7 +601,6 @@ class RecipeListModel(gtk.ListStore):
>           item_deps = self[item_path][self.COL_DEPS]
>
>           self[item_path][self.COL_INC] = True
> -        self.selection_change_notification()
>
>           item_bin = self[item_path][self.COL_BINB].split(', ')
>           if binb and not binb in item_bin:
> @@ -642,8 +638,6 @@ class RecipeListModel(gtk.ListStore):
>
>           self[item_path][self.COL_INC] = False
>
> -        self.selection_change_notification()
> -
>           item_name = self[item_path][self.COL_NAME]
>           item_deps = self[item_path][self.COL_DEPS]
>           if item_deps:
> @@ -703,6 +697,7 @@ class RecipeListModel(gtk.ListStore):
>                   path = self.pn_path[pn]
>                   self.include_item(item_path=path,
>                                     binb="User Selected")
> +        self.selection_change_notification()
>
>       def get_selected_image(self):
>           it = self.get_iter_first()
> @@ -724,3 +719,4 @@ class RecipeListModel(gtk.ListStore):
>           self.include_item(item_path=path,
>                             binb="User Selected",
>                             image_contents=True)
> +        self.selection_change_notification()
> diff --git a/lib/bb/ui/crumbs/packageselectionpage.py b/lib/bb/ui/crumbs/packageselectionpage.py
> index 0427fe2..4fb199e 100755
> --- a/lib/bb/ui/crumbs/packageselectionpage.py
> +++ b/lib/bb/ui/crumbs/packageselectionpage.py
> @@ -206,6 +206,7 @@ class PackageSelectionPage (HobPage):
>           else:
>               self.package_model.exclude_item(item_path=path)
>
> +        self.refresh_selection()
>           self.builder.window_sensitive(True)
>
>       def table_toggled_cb(self, table, cell, view_path, toggled_columnid, view_tree):
> diff --git a/lib/bb/ui/crumbs/recipeselectionpage.py b/lib/bb/ui/crumbs/recipeselectionpage.py
> index 234734c..50d4363 100755
> --- a/lib/bb/ui/crumbs/recipeselectionpage.py
> +++ b/lib/bb/ui/crumbs/recipeselectionpage.py
> @@ -202,6 +202,7 @@ class RecipeSelectionPage (HobPage):
>           else:
>               self.recipe_model.exclude_item(item_path=path)
>
> +        self.refresh_selection()
>           self.builder.window_sensitive(True)
>
>       def table_toggled_cb(self, table, cell, view_path, toggled_columnid, view_tree):
Dongxiao Xu - March 14, 2012, 11:54 p.m.
On Wed, 2012-03-14 at 12:37 -0700, Joshua Lock wrote:
> 
> On 14/03/12 02:26, Dongxiao Xu wrote:
> > Originally we will send selection chagned notification in each
> > include_item and exclude_item, which is time cost since these are
> > recursive functions and we may select hundreds of recipes/packages.
> >
> > The improvement is to move the notification from include_item and
> > exclude_item to the place where the two functions are called.
> > This could greatly improve the selection/deselection speed for recipe
> > and package lists.
> 
> Awesome! So instead of sending the change notification for each 
> included/excluded item with this change the signal will be sent once 
> when a set of changes are made. Right?

Yes, you are right. Now the signal only emits once where a bunch of
changes happen.

Thanks,
Dongxiao

> 
> >
> > Signed-off-by: Dongxiao Xu<dongxiao.xu@intel.com>
> 
> Signed-off-by: Joshua Lock <josh@linux.intel.com>
> 
> > ---
> >   lib/bb/ui/crumbs/hoblistmodel.py         |   10 +++-------
> >   lib/bb/ui/crumbs/packageselectionpage.py |    1 +
> >   lib/bb/ui/crumbs/recipeselectionpage.py  |    1 +
> >   3 files changed, 5 insertions(+), 7 deletions(-)
> >
> > diff --git a/lib/bb/ui/crumbs/hoblistmodel.py b/lib/bb/ui/crumbs/hoblistmodel.py
> > index edd61b5..caf31bc 100644
> > --- a/lib/bb/ui/crumbs/hoblistmodel.py
> > +++ b/lib/bb/ui/crumbs/hoblistmodel.py
> > @@ -216,8 +216,6 @@ class PackageListModel(gtk.TreeStore):
> >
> >           self[item_path][self.COL_INC] = True
> >
> > -        self.selection_change_notification()
> > -
> >           it = self.get_iter(item_path)
> >
> >           # If user explicitly selects a recipe, all its providing packages are selected.
> > @@ -276,8 +274,6 @@ class PackageListModel(gtk.TreeStore):
> >
> >           self[item_path][self.COL_INC] = False
> >
> > -        self.selection_change_notification()
> > -
> >           item_name = self[item_path][self.COL_NAME]
> >           item_rdep = self[item_path][self.COL_RDEP]
> >           it = self.get_iter(item_path)
> > @@ -343,6 +339,7 @@ class PackageListModel(gtk.TreeStore):
> >               else:
> >                   left.append(pn)
> >
> > +        self.selection_change_notification()
> >           return left
> >
> >       def get_selected_packages(self):
> > @@ -604,7 +601,6 @@ class RecipeListModel(gtk.ListStore):
> >           item_deps = self[item_path][self.COL_DEPS]
> >
> >           self[item_path][self.COL_INC] = True
> > -        self.selection_change_notification()
> >
> >           item_bin = self[item_path][self.COL_BINB].split(', ')
> >           if binb and not binb in item_bin:
> > @@ -642,8 +638,6 @@ class RecipeListModel(gtk.ListStore):
> >
> >           self[item_path][self.COL_INC] = False
> >
> > -        self.selection_change_notification()
> > -
> >           item_name = self[item_path][self.COL_NAME]
> >           item_deps = self[item_path][self.COL_DEPS]
> >           if item_deps:
> > @@ -703,6 +697,7 @@ class RecipeListModel(gtk.ListStore):
> >                   path = self.pn_path[pn]
> >                   self.include_item(item_path=path,
> >                                     binb="User Selected")
> > +        self.selection_change_notification()
> >
> >       def get_selected_image(self):
> >           it = self.get_iter_first()
> > @@ -724,3 +719,4 @@ class RecipeListModel(gtk.ListStore):
> >           self.include_item(item_path=path,
> >                             binb="User Selected",
> >                             image_contents=True)
> > +        self.selection_change_notification()
> > diff --git a/lib/bb/ui/crumbs/packageselectionpage.py b/lib/bb/ui/crumbs/packageselectionpage.py
> > index 0427fe2..4fb199e 100755
> > --- a/lib/bb/ui/crumbs/packageselectionpage.py
> > +++ b/lib/bb/ui/crumbs/packageselectionpage.py
> > @@ -206,6 +206,7 @@ class PackageSelectionPage (HobPage):
> >           else:
> >               self.package_model.exclude_item(item_path=path)
> >
> > +        self.refresh_selection()
> >           self.builder.window_sensitive(True)
> >
> >       def table_toggled_cb(self, table, cell, view_path, toggled_columnid, view_tree):
> > diff --git a/lib/bb/ui/crumbs/recipeselectionpage.py b/lib/bb/ui/crumbs/recipeselectionpage.py
> > index 234734c..50d4363 100755
> > --- a/lib/bb/ui/crumbs/recipeselectionpage.py
> > +++ b/lib/bb/ui/crumbs/recipeselectionpage.py
> > @@ -202,6 +202,7 @@ class RecipeSelectionPage (HobPage):
> >           else:
> >               self.recipe_model.exclude_item(item_path=path)
> >
> > +        self.refresh_selection()
> >           self.builder.window_sensitive(True)
> >
> >       def table_toggled_cb(self, table, cell, view_path, toggled_columnid, view_tree):
>

Patch

diff --git a/lib/bb/ui/crumbs/hoblistmodel.py b/lib/bb/ui/crumbs/hoblistmodel.py
index edd61b5..caf31bc 100644
--- a/lib/bb/ui/crumbs/hoblistmodel.py
+++ b/lib/bb/ui/crumbs/hoblistmodel.py
@@ -216,8 +216,6 @@  class PackageListModel(gtk.TreeStore):
 
         self[item_path][self.COL_INC] = True
 
-        self.selection_change_notification()
-
         it = self.get_iter(item_path)
 
         # If user explicitly selects a recipe, all its providing packages are selected.
@@ -276,8 +274,6 @@  class PackageListModel(gtk.TreeStore):
 
         self[item_path][self.COL_INC] = False
 
-        self.selection_change_notification()
-
         item_name = self[item_path][self.COL_NAME]
         item_rdep = self[item_path][self.COL_RDEP]
         it = self.get_iter(item_path)
@@ -343,6 +339,7 @@  class PackageListModel(gtk.TreeStore):
             else:
                 left.append(pn)
 
+        self.selection_change_notification()
         return left
 
     def get_selected_packages(self):
@@ -604,7 +601,6 @@  class RecipeListModel(gtk.ListStore):
         item_deps = self[item_path][self.COL_DEPS]
 
         self[item_path][self.COL_INC] = True
-        self.selection_change_notification()
 
         item_bin = self[item_path][self.COL_BINB].split(', ')
         if binb and not binb in item_bin:
@@ -642,8 +638,6 @@  class RecipeListModel(gtk.ListStore):
 
         self[item_path][self.COL_INC] = False
 
-        self.selection_change_notification()
-
         item_name = self[item_path][self.COL_NAME]
         item_deps = self[item_path][self.COL_DEPS]
         if item_deps:
@@ -703,6 +697,7 @@  class RecipeListModel(gtk.ListStore):
                 path = self.pn_path[pn]
                 self.include_item(item_path=path,
                                   binb="User Selected")
+        self.selection_change_notification()
 
     def get_selected_image(self):
         it = self.get_iter_first()
@@ -724,3 +719,4 @@  class RecipeListModel(gtk.ListStore):
         self.include_item(item_path=path,
                           binb="User Selected",
                           image_contents=True)
+        self.selection_change_notification()
diff --git a/lib/bb/ui/crumbs/packageselectionpage.py b/lib/bb/ui/crumbs/packageselectionpage.py
index 0427fe2..4fb199e 100755
--- a/lib/bb/ui/crumbs/packageselectionpage.py
+++ b/lib/bb/ui/crumbs/packageselectionpage.py
@@ -206,6 +206,7 @@  class PackageSelectionPage (HobPage):
         else:
             self.package_model.exclude_item(item_path=path)
 
+        self.refresh_selection()
         self.builder.window_sensitive(True)
 
     def table_toggled_cb(self, table, cell, view_path, toggled_columnid, view_tree):
diff --git a/lib/bb/ui/crumbs/recipeselectionpage.py b/lib/bb/ui/crumbs/recipeselectionpage.py
index 234734c..50d4363 100755
--- a/lib/bb/ui/crumbs/recipeselectionpage.py
+++ b/lib/bb/ui/crumbs/recipeselectionpage.py
@@ -202,6 +202,7 @@  class RecipeSelectionPage (HobPage):
         else:
             self.recipe_model.exclude_item(item_path=path)
 
+        self.refresh_selection()
         self.builder.window_sensitive(True)
 
     def table_toggled_cb(self, table, cell, view_path, toggled_columnid, view_tree):