Re: gtk_ctree_insert_node - why so slow?
- From: John Cupitt <john cupitt ng-london org uk>
- To: Olaf Frączyk <olaf cbk poznan pl>
- Cc: gtk-list gnome org
- Subject: Re: gtk_ctree_insert_node - why so slow?
- Date: Mon, 19 Nov 2001 17:59:25 +0000
Olaf Frączyk wrote:
On 2001.11.15 13:50:54 +0100 John Cupitt wrote:
Hi Olaf, could you post a test program that shows this bad behaviour?
It'll save us each making one :-)
(maybe you have auto_sort turned on? turn it off, insert 6000 times,
then turn it on again)
As you wish, I attache a 2 sample programs:
one adds with siblings, other without.
Hi again, I did some poking about, and I think gtk_ctree_insert_node()
is just slow if you are appending. Even if sibling is non-NULL, it still
does a lengthy search in gtk_ctree_link().
I don't understand why this is -- the row list is doubly linked, it
shouldn't need to search. I think the only solution is to build your
node list backwards (always pass the first child in as the sibling).
Here's a version of your program which tries to append quickly (and fails)
--
#include <stdio.h>
#include <gtk/gtk.h>
static void
fill_tree( GtkCTree *ctree, int num_of_rows )
{
int i;
GtkCTreeNode *node, *last_node;
gchar *text[2];
char buf[255];
gtk_clist_freeze( GTK_CLIST( ctree ) );
sprintf( buf, "last node" );
text[0] = buf;
text[1] = NULL;
last_node = gtk_ctree_insert_node( ctree,
NULL, NULL, text, 2, NULL, NULL, NULL, NULL, TRUE,
TRUE );
for( node = NULL, i = 0; i < num_of_rows; i++ ) {
sprintf( buf, "node %i in tree", i );
text[0] = buf;
text[1] = NULL;
node = gtk_ctree_insert_node( ctree,
NULL, last_node, text, 2, NULL, NULL, NULL, NULL, TRUE,
TRUE );
}
gtk_ctree_remove_node( ctree, last_node );
gtk_clist_thaw( GTK_CLIST( ctree ) );
}
int
main( int argc, char *argv[] )
{
GTimer *timer = g_timer_new();
GtkWidget *window;
GtkWidget *ctree;
GtkWidget *swin;
gtk_init( &argc, &argv );
window = gtk_window_new( GTK_WINDOW_TOPLEVEL );
swin = gtk_scrolled_window_new( NULL, NULL );
gtk_container_add( GTK_CONTAINER( window ), swin );
ctree = gtk_ctree_new( 1, 0 );
gtk_container_add( GTK_CONTAINER( swin ), ctree );
g_timer_reset( timer );
fill_tree( GTK_CTREE( ctree ), 6000 );
printf( "Tree fill took %.3fs\n", g_timer_elapsed( timer, NULL ) );
gtk_widget_show_all( window );
gtk_main();
return( 0 );
}
--
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]