/* * Copyright (C) 2011 Red Hat Inc. * * Author: * Matthias Clasen * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include const gchar list_ui[] = "" " " " " " " " " " " " " " " " " " " " " " OneTwoThreeTrue5050" " " " " " " " " " " " True" " liststore1" " " " " " First column" " " " " " " " " " 0" " " " " " " " " " " " " " 3" " " " " " " " " " " " " " Second column" " " " " " " " " " 1" " " " " " " " " " " " " " 4" " " " " " " " " " " " " " " ""; static void walk_accessible_tree (AtkObject *accessible, gpointer data) { gint *count = data; gint i; (*count)++; for (i = 0; i < atk_object_get_n_accessible_children (accessible); i++) { AtkObject *child = atk_object_ref_accessible_child (accessible, i); walk_accessible_tree (child, data); g_object_unref (child); } } static GtkWidget * builder_get_toplevel (GtkBuilder *builder) { GSList *list, *walk; GtkWidget *window = NULL; list = gtk_builder_get_objects (builder); for (walk = list; walk; walk = walk->next) { if (GTK_IS_WINDOW (walk->data) && gtk_widget_get_parent (walk->data) == NULL) { window = walk->data; break; } } g_slist_free (list); return window; } static void populate_list (GtkBuilder *builder) { GtkTreeView *tv; GtkListStore *store; GtkTreeIter iter; gint i; tv = (GtkTreeView *)gtk_builder_get_object (builder, "treeview1"); store = (GtkListStore *)gtk_tree_view_get_model (tv); /* append a thousand rows */ for (i = 0; i < 1000; i++) { gtk_list_store_append (store, &iter); gtk_list_store_set (store, &iter, 0, "Bla", 1, "Bla bla", 2, "Bla bla bla", 3, i % 2 == 0 ? TRUE : FALSE, 4, i % 100, 5, i, -1); } } static void test_performance_list (void) { GtkBuilder *builder; gdouble elapsed; GtkWidget *window; GError *error = NULL; builder = gtk_builder_new (); gtk_builder_add_from_string (builder, list_ui, -1, &error); g_assert_no_error (error); window = builder_get_toplevel (builder); g_assert (window); gtk_widget_show (window); g_test_timer_start (); populate_list (builder); elapsed = g_test_timer_elapsed (); g_test_minimized_result (elapsed, "large list test: %gsec", elapsed); g_object_unref (builder); } static void test_a11y_performance_list (void) { GtkBuilder *builder; gdouble elapsed; GtkWidget *window; GError *error = NULL; gint count_before; gint count_after; builder = gtk_builder_new (); gtk_builder_add_from_string (builder, list_ui, -1, &error); g_assert_no_error (error); window = builder_get_toplevel (builder); g_assert (window); gtk_widget_show (window); g_test_timer_start (); /* make sure all accessibles exist */ count_before = 0; walk_accessible_tree (gtk_widget_get_accessible (window), &count_before); populate_list (builder); /* for good measure, do this again */ count_after = 0; walk_accessible_tree (gtk_widget_get_accessible (window), &count_after); elapsed = g_test_timer_elapsed (); g_test_minimized_result (elapsed, "large list with a11y: %gsec", elapsed); g_object_unref (builder); g_test_message ("%d accessibles before, %d after\n", count_before, count_after); } const gchar tree_ui[] = "" " " " " " " " " " " " " " " " " " " " " " " " " " " " True" " treestore1" " " " " " First column" " " " " " " " " " 0" " " " " " " " " " " " " " 3" " " " " " " " " " " " " " Second column" " " " " " " " " " 1" " " " " " " " " " " " " " 4" " " " " " " " " " " " " " " ""; static void populate_tree (GtkBuilder *builder) { GtkTreeView *tv; GtkTreeStore *store; GtkTreeIter iter; gint i; tv = (GtkTreeView *)gtk_builder_get_object (builder, "treeview1"); store = (GtkTreeStore *)gtk_tree_view_get_model (tv); /* append a thousand rows */ for (i = 0; i < 333; i++) { gtk_tree_store_append (store, &iter, NULL); gtk_tree_store_set (store, &iter, 0, "Bla", 1, "Bla bla", 2, "Bla bla bla", 3, i % 2 == 0 ? TRUE : FALSE, 4, i % 100, 5, i, -1); gtk_tree_store_append (store, &iter, &iter); gtk_tree_store_set (store, &iter, 0, "Bla", 1, "Bla bla", 2, "Bla bla bla", 3, i % 2 == 0 ? TRUE : FALSE, 4, i % 100, 5, i, -1); gtk_tree_store_append (store, &iter, &iter); gtk_tree_store_set (store, &iter, 0, "Bla", 1, "Bla bla", 2, "Bla bla bla", 3, i % 2 == 0 ? TRUE : FALSE, 4, i % 100, 5, i, -1); } } static void test_performance_tree (void) { GtkBuilder *builder; gdouble elapsed; GtkWidget *window; GError *error = NULL; builder = gtk_builder_new (); gtk_builder_add_from_string (builder, tree_ui, -1, &error); g_assert_no_error (error); window = builder_get_toplevel (builder); g_assert (window); gtk_widget_show (window); g_test_timer_start (); populate_tree (builder); elapsed = g_test_timer_elapsed (); g_test_minimized_result (elapsed, "large tree test: %gsec", elapsed); g_object_unref (builder); } static void test_a11y_performance_tree (void) { GtkBuilder *builder; gdouble elapsed; GtkWidget *window; GError *error = NULL; gint count_before; gint count_after; builder = gtk_builder_new (); gtk_builder_add_from_string (builder, tree_ui, -1, &error); g_assert_no_error (error); window = builder_get_toplevel (builder); g_assert (window); gtk_widget_show (window); g_test_timer_start (); /* make sure all accessibles exist */ count_before = 0; walk_accessible_tree (gtk_widget_get_accessible (window), &count_before); populate_tree (builder); /* for good measure, do this again */ count_after = 0; walk_accessible_tree (gtk_widget_get_accessible (window), &count_after); elapsed = g_test_timer_elapsed (); g_test_minimized_result (elapsed, "large tree with a11y: %gsec", elapsed); g_object_unref (builder); g_test_message ("%d accessibles before, %d after\n", count_before, count_after); } int main (int argc, char *argv[]) { gtk_test_init (&argc, &argv, NULL); if (!g_test_perf ()) return 0; g_test_add_func ("/performance/list", test_performance_list); g_test_add_func ("/a11y/performance/list", test_a11y_performance_list); g_test_add_func ("/performance/tree", test_performance_tree); g_test_add_func ("/a11y/performance/tree", test_a11y_performance_tree); return g_test_run (); }