[GNOME VFS] mime info parsing patch ...

Michael Meeks <[email protected]> 11 Jul 2002 12:13:27 +0100
Newsgroups gmane.comp.gnome.vfs
Message-ID <[email protected]>
Hi there,

	This patch gets mime parsing down to ~33ms on my machine down from 51ms
by doing some simple things, That doesn't sound much, but on my Ultra 2
it takes ~ 380ms to parse, hopefully this will get it down to 250 or so.

	May I commit ?

	Regards,

		Michael.

Index: ChangeLog
===================================================================
RCS file: /cvs/gnome/gnome-vfs/ChangeLog,v
retrieving revision 1.1334.2.12
diff -u -p -u -r1.1334.2.12 ChangeLog
--- ChangeLog	9 Jul 2002 13:40:49 -0000	1.1334.2.12
+++ ChangeLog	11 Jul 2002 11:09:52 -0000
@@ -1,4 +1,15 @@
+2002-07-11  Michael Meeks  <[email protected]>
+
+	* libgnomevfs/gnome-vfs-mime-info.c
+	(load_type_info_from): use g_string_truncate
+	for a 20% speedup.
+	(APPEND_CHAR): inline more for another 20%.
+
+	* test/test-mime.c (main): add --speedTest
+	for mime info reloading.
+
 2002-07-05  Stephen Browne  <[email protected]>
+
 	* modules/cdemenu-desktop-method.c
 	Patch from [email protected]
 	modified the code so that the function create_cde_icon_name_cache
Index: libgnomevfs/gnome-vfs-mime-info.c
===================================================================
RCS file: /cvs/gnome/gnome-vfs/libgnomevfs/gnome-vfs-mime-info.c,v
retrieving revision 1.63.2.1
diff -u -p -u -r1.63.2.1 gnome-vfs-mime-info.c
--- libgnomevfs/gnome-vfs-mime-info.c	26 Jun 2002 02:33:32 -0000	1.63.2.1
+++ libgnomevfs/gnome-vfs-mime-info.c	11 Jul 2002 11:09:53 -0000
@@ -303,7 +303,17 @@ typedef enum {
 	STATE_ON_VALUE
 } ParserState;
 
-#define APPEND_CHAR(gstr,c) g_string_insert_c ((gstr), -1, (c))
+/* #define APPEND_CHAR(gstr,c) g_string_insert_c ((gstr), -1, (c)) */
+
+#define APPEND_CHAR(gstr,c) \
+	G_STMT_START {                                     \
+		if (gstr->len + 1 < gstr->allocated_len) { \
+			gstr->str [gstr->len++] = c;       \
+			gstr->str [gstr->len] = '\0';      \
+		} else {                                   \
+			g_string_insert_c (gstr, -1, c);   \
+		}                                          \
+	} G_STMT_END
 
 typedef enum {
 	FORMAT_MIME,
@@ -352,7 +362,7 @@ load_type_info_from (const char *filenam
 			if (c == '\n') {
 				skip_line = FALSE;
 				column = -1;
-				g_string_assign (line, "");
+				g_string_truncate (line, 0);
 				key = lang = last_str_end = 0;
 			}
 			continue;
@@ -374,7 +384,7 @@ load_type_info_from (const char *filenam
 						 line->str + last_str_end);
 				key = lang = 0;
 			}
-			g_string_assign (line, "");
+			g_string_truncate (line, 0);
 			last_str_end = 0;
 			state = STATE_LOOKING_FOR_KEY;
 			continue;
@@ -478,7 +488,7 @@ load_type_info_from (const char *filenam
 				    language_level (line->str + lang) < 0) {
 					skip_line = TRUE;
 					key = lang = last_str_end = 0;
-					g_string_assign (line, "");
+					g_string_truncate (line, 0);
 					state = STATE_LOOKING_FOR_KEY;
 				}
 			} else {
Index: test/test-mime.c
===================================================================
RCS file: /cvs/gnome/gnome-vfs/test/test-mime.c,v
retrieving revision 1.13
diff -u -p -u -r1.13 test-mime.c
--- test/test-mime.c	17 May 2002 11:00:18 -0000	1.13
+++ test/test-mime.c	11 Jul 2002 11:09:53 -0000
@@ -26,6 +26,7 @@
 #include <libgnomevfs/gnome-vfs-init.h>
 #include <libgnomevfs/gnome-vfs-mime-magic.h>
 #include <libgnomevfs/gnome-vfs-mime-utils.h>
+#include <libgnomevfs/gnome-vfs-mime-info.h>
 #include <libgnomevfs/gnome-vfs-mime.h>
 #include <libgnomevfs/gnome-vfs-utils.h>
 
@@ -66,16 +67,20 @@ main (int argc, char **argv)
 	gboolean magic_only;
 	gboolean suffix_only;
 	gboolean dump_table;
+	gboolean speed_test;
 	const char *result;
 	const char *table_path;
 	char *uri_string;
 	char *curdir;
 	char *path;
 	struct stat tmp;
+	GTimer *timer;
+	int i;
 
 	table_path = NULL;
 	magic_only = FALSE;
 	dump_table = FALSE;
+	speed_test = FALSE;
 	suffix_only = FALSE;
 	
 	if (!gnome_vfs_init ()) {
@@ -98,6 +103,8 @@ main (int argc, char **argv)
 			suffix_only = TRUE;
 		} else if (strcmp (*argv, "--dumpTable") == 0) {
 			dump_table = TRUE;
+		} else if (strcmp (*argv, "--speedTest") == 0) {
+			speed_test = TRUE;
 		} else if (strcmp (*argv, "--loadTable") == 0) {
 			++argv;
 			if (!*argv) {
@@ -121,6 +128,16 @@ main (int argc, char **argv)
 
 	if (dump_table) {
 		gnome_vfs_mime_dump_magic_table ();
+	}
+
+	if (speed_test) {
+		timer = g_timer_new ();
+		g_timer_start (timer);
+		for (i = 0; i < 100; i++) {
+			gnome_vfs_mime_info_reload ();
+		}
+		fprintf (stderr, "Mime reload took %g(ms)\n",
+			 g_timer_elapsed (timer, NULL) * 10.0);
 	}
 
 	for (; *argv != NULL; argv++) {
-- 
 [email protected]  <><, Pseudo Engineer, itinerant idiot


_______________________________________________
gnome-vfs maillist  -  [email protected]
http://lists.ximian.com/mailman/listinfo/gnome-vfs