> Nicolas, can you get another profile using Markku's patch?

Most certainly!

A couple of preliminary remarks.

I have observed a startup time increase of between 20% and 30%.

When scrolling, here is what I observed:
   - when displaying the selected row, performance is as bad as  
before (scrollbars take between 5 and 15 seconds to react)
   - when not displaying the selected row, performance is acceptable  
(scrollbars take between 0 and 2 seconds to react, and I'm compiling  
at -O0)

An interesting point to note is that this seems due to the drawing of  
the keyboard input rectangle (the dotted lines rectangle): when I  
select a row with the mouse, the interface is snappy, both for  
selecting and for scrolling (between 0 and 2 seconds response time),  
but when I then change the selected row using Up or Down keys, the  
interface takes around 10 seconds to highlight the newly selected row.
Maybe the experts will have an idea why this is so?

Let's have a look at the relevant time profile (line N calls line N+1):

Self    Total   Library                 Symbol

0.0%    73.7%   libgtk-x11-2.0.0.dylib  gtk_main        
0.0%    73.7%   libglib-2.0.0.dylib     g_main_loop_run 
0.0%    73.7%   libglib-2.0.0.dylib     g_main_context_iterate  
0.0%    73.6%   libglib-2.0.0.dylib     g_main_context_dispatch 
0.0%    73.6%   libglib-2.0.0.dylib     g_main_dispatch 
0.0%    71.8%   libglib-2.0.0.dylib     g_idle_dispatch 
0.0%    71.8%   libgdk-x11-2.0.0.dylib  gdk_threads_dispatch    
0.0%    71.8%   libgdk-x11-2.0.0.dylib  gdk_window_update_idle  
0.0%    71.8%   libgdk-x11-2.0.0.dylib  gdk_window_process_all_updates  
0.0%    71.8%   libgdk-x11-2.0.0.dylib  gdk_window_process_updates_internal     
0.0%    71.8%   libgtk-x11-2.0.0.dylib  gtk_main_do_event       
0.0%    71.8%   libgtk-x11-2.0.0.dylib  gtk_widget_send_expose  
0.0%    71.8%   libgtk-x11-2.0.0.dylib  gtk_widget_event_internal       
0.0%    71.8%   libgobject-2.0.0.dylib  g_signal_emit   
0.0%    71.8%   libgobject-2.0.0.dylib  g_signal_emit_valist    
0.0%    71.8%   libgobject-2.0.0.dylib  signal_emit_unlocked_R  
0.0%    71.8%   libgobject-2.0.0.dylib  g_closure_invoke        
0.0%    71.8%   libgobject-2.0.0.dylib  g_type_class_meta_marshal       
0.0%    71.8%   libgtk-x11-2.0.0.dylib  _gtk_marshal_BOOLEAN__BOXED     
0.0%    71.8%   libgtk-x11-2.0.0.dylib  gtk_tree_view_expose    
0.1%    71.5%   libgtk-x11-2.0.0.dylib  gtk_tree_view_bin_expose        
0.0%    67.0%   libgtk-x11-2.0.0.dylib  gtk_paint_focus 
0.0%    67.0%   libgtk-x11-2.0.0.dylib  gtk_default_draw_focus  
0.0%    67.0%   libcairo.2.dylib        cairo_stroke    
0.0%    67.0%   libcairo.2.dylib        cairo_stroke_preserve   
0.0%    67.0%   libcairo.2.dylib        _cairo_gstate_stroke    
0.0%    67.0%   libcairo.2.dylib        _cairo_surface_stroke   
0.0%    67.0%   libcairo.2.dylib        _cairo_surface_fallback_stroke  
0.0%    66.9%   libcairo.2.dylib        _clip_and_composite_trapezoids  
0.0%    66.8%   libcairo.2.dylib        _cairo_traps_extract_region     
0.0%    66.8%   libcairo.2.dylib        _cairo_pixman_region_union_rect 
0.0%    66.8%   libcairo.2.dylib        _cairo_pixman_region_union      
9.7%    66.7%   libcairo.2.dylib        pixman_op       


A bit of analysis, now. As before the patch, most of the time is  
spent in gtk_tree_view_bin_expose.
If we have a closer look at the previous "hot spot", here's what we see:

Self    Total   Line            Code

                4240          /* we *need* to set cell data on all cells before 
the  
call                    
                4241           * to _has_special_cell, else _has_special_cell() 
does  
not                     
                4242           * return a correct value.                        
                4243           */                       
                4244          for (list = (rtl ? g_list_last (tree_view->priv- 
 >columns) : g_list_first (tree_view->priv->columns));                  
                4245               list;                        
12.5%   0.0%    4246               list = (rtl ? list->prev : list->next))      
                
                4247            {                       
28.1%   0.0%    4248              GtkTreeViewColumn *column = list->data;       
                
3.1%    5.6%    4249              gtk_tree_view_column_cell_set_cell_data 
(column,                      
                4250                                                       
tree_view->priv->model,                      
                4251                                                       
&iter,                       
                4252                                                       
GTK_RBNODE_FLAG_SET (node, GTK_RBNODE_IS_PARENT),                    
                4253                                                       
node->children?TRUE:FALSE);                  
                4254            }                       


We spend between 3 and 4% of the time in  
gtk_tree_view_column_cell_set_cell_data, where we previously spent  
around 26% of the time. So Markku's patch definitely ironed out a  
performance bottleneck (congrats, I think this patch is a keeper.)

Now, let's try to figure out where the time goes. The call which  
occupies the time in gtk_tree_view_bin_expose is the call to  
gtk_default_paint_focus (which explains why the interface is  
responsive when not painting the focus row).

This leads us into the depths of cairo. Before we I go down that  
road, I'd like to have a better understanding of why the keyboard  
navigation is so slow when the mouse navigation is fine.

With Markku's patch, I think we're close to having a tree view  
capable of handling 5000 columns - the fact that we get good  
performance when using the mouse focus instead of keyboard focus  
gives me good hopes :)

Nicolas
_______________________________________________
gtk-devel-list mailing list
gtk-devel-list@gnome.org
http://mail.gnome.org/mailman/listinfo/gtk-devel-list

Reply via email to