diff options
author | Matthias Clasen <mclasen@redhat.com> | 2020-01-23 23:12:29 -0500 |
---|---|---|
committer | Matthias Clasen <mclasen@redhat.com> | 2020-01-24 09:09:08 -0500 |
commit | 5dcce0c0bdccf5b55a15ff45247b2fc06bf77f7f (patch) | |
tree | 1e432465b6318f8de1c9f5d8615d97dde75d84cf /gtk/gtkcssselector.c | |
parent | 975fe76a0edd82bbb1d8f7225a01f44aa8ab0115 (diff) | |
download | gtk+-5dcce0c0bdccf5b55a15ff45247b2fc06bf77f7f.tar.gz |
css: Print out relative costs of selectors
Count how often each tree node is visited, and print the number
at the end. This gives a good indication what selectors are costly
and should be avoided. #ifdefed out.
Diffstat (limited to 'gtk/gtkcssselector.c')
-rw-r--r-- | gtk/gtkcssselector.c | 44 |
1 files changed, 27 insertions, 17 deletions
diff --git a/gtk/gtkcssselector.c b/gtk/gtkcssselector.c index 39552dfd0e..ced616e545 100644 --- a/gtk/gtkcssselector.c +++ b/gtk/gtkcssselector.c @@ -124,6 +124,7 @@ struct _GtkCssSelectorTree gint32 previous_offset; gint32 sibling_offset; gint32 matches_offset; /* pointers that we return as matches if selector matches */ + guint64 match_count; }; static gboolean @@ -1857,6 +1858,8 @@ gtk_css_selector_tree_match_foreach (const GtkCssSelector *selector, const GtkCssSelectorTree *tree = (const GtkCssSelectorTree *) selector; const GtkCssSelectorTree *prev; + ((GtkCssSelectorTree *)tree)->match_count++; + if (!gtk_css_selector_match (selector, matcher)) return FALSE; @@ -1978,7 +1981,6 @@ _gtk_css_selector_tree_print (const GtkCssSelectorTree *tree, GString *str, char { gboolean first = TRUE; int len, i; - gpointer *matches; for (; tree != NULL; tree = gtk_css_selector_tree_get_sibling (tree), first = FALSE) { @@ -2002,16 +2004,8 @@ _gtk_css_selector_tree_print (const GtkCssSelectorTree *tree, GString *str, char len = str->len; tree->selector.class->print (&tree->selector, str); - matches = gtk_css_selector_tree_get_matches (tree); - if (matches) - { - int n; - for (n = 0; matches[n] != NULL; n++) ; - if (n == 1) - g_string_append (str, " (1 match)"); - else - g_string_append_printf (str, " (%d matches)", n); - } + if (tree->match_count) + g_string_append_printf (str, " (%ld hits)", tree->match_count); len = str->len - len; if (gtk_css_selector_tree_get_previous (tree)) @@ -2032,6 +2026,24 @@ _gtk_css_selector_tree_print (const GtkCssSelectorTree *tree, GString *str, char g_string_append (str, "\n"); } } + +static GSList *trees; + +static void print_atexit (void) +{ + GSList *l; + + for (l = trees; l; l = l->next) + { + const GtkCssSelectorTree *tree = l->data; + + GString *s = g_string_new (""); + _gtk_css_selector_tree_print (tree, s, ""); + g_print ("%s", s->str); + g_string_free (s, TRUE); + } +} + #endif void @@ -2159,6 +2171,7 @@ subdivide_infos (GByteArray *array, GList *infos, gint32 parent_offset) tree = alloc_tree (array, &tree_offset); tree->parent_offset = parent_offset; tree->selector = max_selector; + tree->match_count = 0; exact_matches = NULL; for (l = infos; l != NULL; l = l->next) @@ -2298,12 +2311,9 @@ _gtk_css_selector_tree_builder_build (GtkCssSelectorTreeBuilder *builder) } #ifdef PRINT_TREE - { - GString *s = g_string_new (""); - _gtk_css_selector_tree_print (tree, s, ""); - g_print ("%s", s->str); - g_string_free (s, TRUE); - } + if (trees == NULL) + atexit (print_atexit); + trees = g_slist_append (trees, tree); #endif return tree; |