[geany/geany-plugins] 297be8: debugger: Greatly improve Stack Tree population speed

Colomban Wendling git-noreply at xxxxx
Sun Feb 7 03:32:58 UTC 2016


Branch:      refs/heads/master
Author:      Colomban Wendling <ban at herbesfolles.org>
Committer:   Colomban Wendling <ban at herbesfolles.org>
Date:        Sun, 07 Feb 2016 03:32:58 UTC
Commit:      297be8db19e805238e8962c75aa2d74bf3cd8bbf
             https://github.com/geany/geany-plugins/commit/297be8db19e805238e8962c75aa2d74bf3cd8bbf

Log Message:
-----------
debugger: Greatly improve Stack Tree population speed

Appending elements to a TreeStore is very slow, while prepending them
is fast.  As we add all items at once, prepend elements in reverse
order, which is a lot faster and does the same.

This leads to tremendous speedups with large stack traces.
For example, showing a 105000 frames height trace (resulting from
infinite recursion and thus stack exhaustion) used to take more than
105s, while it now takes less than 0.3s.


Modified Paths:
--------------
    debugger/src/debug.c
    debugger/src/stree.c
    debugger/src/stree.h

Modified: debugger/src/debug.c
6 lines changed, 1 insertions(+), 5 deletions(-)
===================================================================
@@ -700,11 +700,7 @@ static void on_debugger_stopped (int thread_id)
 
 	/* get current stack trace and put in the tree view */
 	stack = active_module->get_stack();
-	for (iter = stack; iter; iter = iter->next)
-	{
-		frame *f = (frame*)iter->data;
-		stree_add(f);
-	}
+	stree_add (stack);
 	stree_select_first_frame(TRUE);
 
 	/* files */


Modified: debugger/src/stree.c
19 lines changed, 14 insertions(+), 5 deletions(-)
===================================================================
@@ -430,20 +430,29 @@ GtkWidget* stree_init(move_to_line_cb ml, select_frame_cb sf)
 }
 
 /*
- *	add frame to the tree view
+ *	add frames to the tree view
  */
-void stree_add(frame *f)
+void stree_add(GList *frames)
 {
+	GList *item;
 	GtkTreeRowReference *reference = (GtkTreeRowReference*)g_hash_table_lookup(threads, (gpointer)active_thread_id);
-	GtkTreeIter frame_iter;
 	GtkTreeIter thread_iter;
 	GtkTreePath *path = gtk_tree_row_reference_get_path(reference);
 	gtk_tree_model_get_iter(model, &thread_iter, path);
 	gtk_tree_path_free(path);
 
-	gtk_tree_store_insert_before(store, &frame_iter, &thread_iter, 0);
+	g_object_ref (model);
+	gtk_tree_view_set_model (GTK_TREE_VIEW (tree), NULL);
 
-	gtk_tree_store_set (store, &frame_iter, S_FRAME, f, -1);
+	/* prepending is a *lot* faster than appending, so prepend with a reversed data set */
+	for (item = g_list_last (frames); item; item = item->prev)
+	{
+		gtk_tree_store_insert_with_values (store, NULL, &thread_iter, 0,
+		                                   S_FRAME, item->data, -1);
+	}
+
+	gtk_tree_view_set_model (GTK_TREE_VIEW (tree), model);
+	g_object_unref (model);
 }
 
 /*


Modified: debugger/src/stree.h
2 lines changed, 1 insertions(+), 1 deletions(-)
===================================================================
@@ -31,7 +31,7 @@
 GtkWidget*		stree_init(move_to_line_cb ml, select_frame_cb sf);
 void			stree_destroy(void);
 
-void 			stree_add(frame *f);
+void 			stree_add(GList *frames);
 void 			stree_clear(void);
 
 void 			stree_add_thread(int thread_id);



--------------
This E-Mail was brought to you by github_commit_mail.py (Source: https://github.com/geany/infrastructure).


More information about the Plugins-Commits mailing list