[PATCH] speed up stock icon registration (was: Improving Nautilus startup time)



Am Mittwoch, den 08.03.2006, 18:33 -0600 schrieb Federico Mena Quintero:
> Hi,
> 
> I'm doing some work to improve GNOME login time.  I'm starting with the
> user-visible pieces first, Nautilus and gnome-panel.  
> 
> I wrote a little program to extract a timeline of Nautilus's startup
> from an strace log.  The first timeline is here:
> 
> http://primates.ximian.com/~federico/news-2006-03.html#login-time-1
> 
> The big white gaps on the left of the chart are where Nautilus does a
> time-consuming process during initialization.  The bottom of the chart
> is where Nautilus finally paints the desktop.
> 
> I think it would be pretty productive if each of a few people would grab
> one of these gaps, and tweak the hell out of it to make it shorter.
> 
> I'm currently looking at improving the startup time of gnome-vfs-daemon.
> I suspect that this is actually the big delay we see when activating any
> bonobo server (i.e. the reason why gedit and gnome-terminal start much
> slower than, say, gnome-calculator).
> 
> Help would be much appreciated :)

The attached patch ensures that we don't hardcode any pixels/icon sizes
and don't lookup any stock icons during icon registration, but just add
all the stock icon names we need to the factory. Measuring with a GTimer
I could reduce the icon registration to rougly 1/4 of the former time,
mostly because the gtk_icon_theme_lookup_icon calls are quite expensive.
I don't know whether it buys us much to delay the icon size lookups
until they're actually needed, but the Nautilus startup feels
significantly faster with the patch applied.

-- 
Christian Neumair <chris gnome-de org>
Index: src/nautilus-main.c
===================================================================
RCS file: /cvs/gnome/nautilus/src/nautilus-main.c,v
retrieving revision 1.151
diff -u -p -r1.151 nautilus-main.c
--- src/nautilus-main.c	15 Dec 2005 14:25:57 -0000	1.151
+++ src/nautilus-main.c	9 Mar 2006 11:10:19 -0000
@@ -132,62 +132,33 @@ static void
 register_icons (void)
 {
 	GtkIconTheme *icon_theme;
-	GtkIconInfo *info;
-	const char *icon;
 	GtkIconSource *source;
 	GtkIconSet *set;
 	GtkIconFactory *factory;
 	const char *icons_to_register[] = {"gnome-fs-client", "gnome-fs-network", "gnome-fs-home", "gnome-fs-trash-empty", "gnome-dev-cdrom", "stock_new-template"};
-	struct { int pixel; int gtk; } sizes[] = {
-		{16, GTK_ICON_SIZE_MENU},
-		{18, GTK_ICON_SIZE_SMALL_TOOLBAR},
-		{20, GTK_ICON_SIZE_BUTTON},
-		{24, GTK_ICON_SIZE_LARGE_TOOLBAR},
-		{32, GTK_ICON_SIZE_DND},
-		{48, GTK_ICON_SIZE_DIALOG},
-		{48, 0},
-	};
-	int i, j;
+	int i;
 
 	icon_theme = nautilus_icon_factory_get_icon_theme ();
 
 	factory = gtk_icon_factory_new ();
 	gtk_icon_factory_add_default (factory);
-	for (i = 0; i < G_N_ELEMENTS(icons_to_register); i++) {
 
+	source = gtk_icon_source_new ();
+
+	for (i = 0; i < G_N_ELEMENTS(icons_to_register); i++) {
 		set = gtk_icon_set_new ();
-		source = gtk_icon_source_new ();
 
-		for (j = 0; j < G_N_ELEMENTS(sizes); j++) {
-			info = gtk_icon_theme_lookup_icon (icon_theme, icons_to_register[i], sizes[j].pixel, 0);
-			
-			if (info != NULL &&
-			    (sizes[j].gtk == 0 ||
-			     gtk_icon_info_get_base_size (info) == sizes[j].pixel)) {
-				icon = gtk_icon_info_get_filename (info);
-				gtk_icon_source_set_filename (source, icon);
-				if (sizes[j].gtk == 0) {
-					gtk_icon_source_set_size (source, 0);
-					gtk_icon_source_set_size_wildcarded (source, TRUE);
-				} else {
-					gtk_icon_source_set_size (source, sizes[j].gtk);
-					gtk_icon_source_set_size_wildcarded (source, FALSE);
-				}
-				gtk_icon_set_add_source (set, source);
-			}
-			if (info != NULL) {
-				gtk_icon_info_free (info);
-			}
-		}
+		gtk_icon_source_set_icon_name (source, icons_to_register[i]);
+		gtk_icon_set_add_source (set, source);
 
-		gtk_icon_source_free (source);
 		gtk_icon_factory_add (factory, icons_to_register[i], set);
-		gtk_icon_set_unref (set);
 
+		gtk_icon_set_unref (set);
 	}
+
+	gtk_icon_source_free (source);
 	g_object_unref (factory);	
 	g_object_unref (icon_theme);
-	
 }
 
 /* Copied from libnautilus/nautilus-program-choosing.c; In this case,

Attachment: signature.asc
Description: Dies ist ein digital signierter Nachrichtenteil



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]