[gtk+/wip/matthiasc/match-all: 3/3] match_all: Only allocate an array when needed



commit c96495966ed1b9f3b38f03c79e7a777478a076fe
Author: Matthias Clasen <mclasen redhat com>
Date:   Wed Sep 9 11:08:43 2015 -0400

    match_all: Only allocate an array when needed
    
    My statistics show that more than half of all calls end up
    with 0 matches, so we can avoid some overhead by not allocating
    an array at all in this case.

 gtk/gtkcssselector.c |   15 ++++++++-------
 1 files changed, 8 insertions(+), 7 deletions(-)
---
diff --git a/gtk/gtkcssselector.c b/gtk/gtkcssselector.c
index 760e630..eed04f7 100644
--- a/gtk/gtkcssselector.c
+++ b/gtk/gtkcssselector.c
@@ -159,8 +159,8 @@ g_ptr_array_insert_sorted (GPtrArray *array,
 }
 
 static void
-gtk_css_selector_tree_found_match (const GtkCssSelectorTree *tree,
-                                  GPtrArray                *array)
+gtk_css_selector_tree_found_match (const GtkCssSelectorTree  *tree,
+                                  GPtrArray                **array)
 {
   int i;
   gpointer *matches;
@@ -168,8 +168,11 @@ gtk_css_selector_tree_found_match (const GtkCssSelectorTree *tree,
   matches = gtk_css_selector_tree_get_matches (tree);
   if (matches)
     {
+      if (!*array)
+        *array = g_ptr_array_sized_new (16);
+
       for (i = 0; matches[i] != NULL; i++)
-        g_ptr_array_insert_sorted (array, matches[i]);
+        g_ptr_array_insert_sorted (*array, matches[i]);
     }
 }
 
@@ -1757,15 +1760,13 @@ GPtrArray *
 _gtk_css_selector_tree_match_all (const GtkCssSelectorTree *tree,
                                  const GtkCssMatcher *matcher)
 {
-  GPtrArray *array;
+  GPtrArray *array = NULL;
 
   update_type_references ();
 
-  array = g_ptr_array_sized_new (16);
-
   for (; tree != NULL;
        tree = gtk_css_selector_tree_get_sibling (tree))
-    gtk_css_selector_foreach (&tree->selector, matcher, gtk_css_selector_tree_match_foreach, array);
+    gtk_css_selector_foreach (&tree->selector, matcher, gtk_css_selector_tree_match_foreach, &array);
 
   return array;
 }


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]