From 05b1004080a458b13390571ea2834b4a33a436a5 Mon Sep 17 00:00:00 2001 From: Claudio Saavedra Date: Sat, 22 Mar 2008 23:52:39 +0000 Subject: [PATCH] =?UTF-8?q?Bug=20523877=20=E2=80=93=20gbookmarkfile:=20avo?= =?UTF-8?q?id=20using=20g=5Fstring=5Fappend=5Fprintf()=20and?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 2008-03-22 Claudio Saavedra Bug 523877 – gbookmarkfile: avoid using g_string_append_printf() and other optimizations * glib/gbookmarkfile.c: (bookmark_metadata_dump), (bookmark_item_dump), (g_bookmark_file_dump), (expand_exec_line): Replace all calls to g_string_append_printf with g_strconcat () or g_string_append () where appropriate, to reduce the file creation time. Also, use g_string_sized_new () with an appropriate buffer size instead of g_string_new (NULL), to reduce time spent in memory reallocation. (#523877, Claudio Saavedra, Emmanuele Bassi) svn path=/trunk/; revision=6752 --- ChangeLog | 13 +++ glib/gbookmarkfile.c | 242 +++++++++++++++++++++++-------------------- 2 files changed, 144 insertions(+), 111 deletions(-) diff --git a/ChangeLog b/ChangeLog index 429a92b22..6511554f4 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,16 @@ +2008-03-22 Claudio Saavedra + + Bug 523877 – gbookmarkfile: avoid using g_string_append_printf() and + other optimizations + + * glib/gbookmarkfile.c: (bookmark_metadata_dump), + (bookmark_item_dump), (g_bookmark_file_dump), (expand_exec_line): + Replace all calls to g_string_append_printf with g_strconcat () or + g_string_append () where appropriate, to reduce the file creation time. + Also, use g_string_sized_new () with an appropriate buffer size instead + of g_string_new (NULL), to reduce time spent in memory reallocation. + (#523877, Claudio Saavedra, Emmanuele Bassi) + 2008-03-22 Emmanuele Bassi Bug 518160 - replace two g_strdup_printf calls in GBookmarkFile diff --git a/glib/gbookmarkfile.c b/glib/gbookmarkfile.c index 5cf320d5e..70ce6ee53 100644 --- a/glib/gbookmarkfile.c +++ b/glib/gbookmarkfile.c @@ -339,56 +339,62 @@ static gchar * bookmark_metadata_dump (BookmarkMetadata *metadata) { GString *retval; + gchar *buffer; if (!metadata->applications) return NULL; - retval = g_string_new (NULL); + retval = g_string_sized_new (1024); /* metadata container */ - g_string_append_printf (retval, - " <%s %s=\"%s\">\n", - XBEL_METADATA_ELEMENT, - XBEL_OWNER_ATTRIBUTE, BOOKMARK_METADATA_OWNER); - + g_string_append (retval, + " " + "<" XBEL_METADATA_ELEMENT + " " XBEL_OWNER_ATTRIBUTE "=\"" BOOKMARK_METADATA_OWNER + "\">\n"); + /* mime type */ - if (metadata->mime_type) - g_string_append_printf (retval, - " <%s:%s %s=\"%s\"/>\n", - MIME_NAMESPACE_NAME, - MIME_TYPE_ELEMENT, - MIME_TYPE_ATTRIBUTE, metadata->mime_type); - + if (metadata->mime_type) { + buffer = g_strconcat (" " + "<" MIME_NAMESPACE_NAME ":" MIME_TYPE_ELEMENT " " + MIME_TYPE_ATTRIBUTE "=\"", metadata->mime_type, "\"/>\n", + NULL); + g_string_append (retval, buffer); + g_free (buffer); + } + if (metadata->groups) { GList *l; /* open groups container */ - g_string_append_printf (retval, - " <%s:%s>\n", - BOOKMARK_NAMESPACE_NAME, - BOOKMARK_GROUPS_ELEMENT); + g_string_append (retval, + " " + "<" BOOKMARK_NAMESPACE_NAME + ":" BOOKMARK_GROUPS_ELEMENT ">\n"); for (l = g_list_last (metadata->groups); l != NULL; l = l->prev) { gchar *group_name; group_name = g_markup_escape_text ((gchar *) l->data, -1); - g_string_append_printf (retval, - " <%s:%s>%s\n", - BOOKMARK_NAMESPACE_NAME, - BOOKMARK_GROUP_ELEMENT, - group_name, - BOOKMARK_NAMESPACE_NAME, - BOOKMARK_GROUP_ELEMENT); + buffer = g_strconcat (" " + "<" BOOKMARK_NAMESPACE_NAME + ":" BOOKMARK_GROUP_ELEMENT ">", + group_name, + "\n", NULL); + g_string_append (retval, buffer); + + g_free (buffer); g_free (group_name); } /* close groups container */ - g_string_append_printf (retval, - " \n", - BOOKMARK_NAMESPACE_NAME, - BOOKMARK_GROUPS_ELEMENT); + g_string_append (retval, + " " + "\n"); } if (metadata->applications) @@ -396,10 +402,10 @@ bookmark_metadata_dump (BookmarkMetadata *metadata) GList *l; /* open applications container */ - g_string_append_printf (retval, - " <%s:%s>\n", - BOOKMARK_NAMESPACE_NAME, - BOOKMARK_APPLICATIONS_ELEMENT); + g_string_append (retval, + " " + "<" BOOKMARK_NAMESPACE_NAME + ":" BOOKMARK_APPLICATIONS_ELEMENT ">\n"); for (l = g_list_last (metadata->applications); l != NULL; l = l->prev) { @@ -419,10 +425,10 @@ bookmark_metadata_dump (BookmarkMetadata *metadata) } /* close applications container */ - g_string_append_printf (retval, - " \n", - BOOKMARK_NAMESPACE_NAME, - BOOKMARK_APPLICATIONS_ELEMENT); + g_string_append (retval, + " " + "\n"); } /* icon */ @@ -430,24 +436,28 @@ bookmark_metadata_dump (BookmarkMetadata *metadata) { if (!metadata->icon_mime) metadata->icon_mime = g_strdup ("application/octet-stream"); - - g_string_append_printf (retval, - " <%s:%s %s=\"%s\" %s=\"%s\"/>\n", - BOOKMARK_NAMESPACE_NAME, - BOOKMARK_ICON_ELEMENT, - BOOKMARK_HREF_ATTRIBUTE, metadata->icon_href, - BOOKMARK_TYPE_ATTRIBUTE, metadata->icon_mime); + + buffer = g_strconcat (" " + "<" BOOKMARK_NAMESPACE_NAME + ":" BOOKMARK_ICON_ELEMENT + " " BOOKMARK_HREF_ATTRIBUTE "=\"", metadata->icon_href, + "\" " BOOKMARK_TYPE_ATTRIBUTE "=\"", metadata->icon_mime, "\"/>\n", NULL); + g_string_append (retval, buffer); + + g_free (buffer); } /* private hint */ if (metadata->is_private) - g_string_append_printf (retval, - " <%s:%s/>\n", - BOOKMARK_NAMESPACE_NAME, - BOOKMARK_PRIVATE_ELEMENT); + g_string_append (retval, + " " + "<" BOOKMARK_NAMESPACE_NAME + ":" BOOKMARK_PRIVATE_ELEMENT "/>\n"); /* close metadata container */ - g_string_append_printf (retval, " \n", XBEL_METADATA_ELEMENT); + g_string_append (retval, + " " + "\n"); return g_string_free (retval, FALSE); } @@ -501,6 +511,7 @@ bookmark_item_dump (BookmarkItem *item) GString *retval; gchar *added, *visited, *modified; gchar *escaped_uri; + gchar *buffer; /* at this point, we must have at least a registered application; if we don't * we don't screw up the bookmark file, and just skip this item @@ -511,37 +522,45 @@ bookmark_item_dump (BookmarkItem *item) return NULL; } - retval = g_string_new (NULL); + retval = g_string_sized_new (4096); added = timestamp_to_iso8601 (item->added); modified = timestamp_to_iso8601 (item->modified); visited = timestamp_to_iso8601 (item->visited); escaped_uri = g_markup_escape_text (item->uri, -1); - - g_string_append_printf (retval, - " <%s %s=\"%s\" %s=\"%s\" %s=\"%s\" %s=\"%s\">\n", - XBEL_BOOKMARK_ELEMENT, - XBEL_HREF_ATTRIBUTE, escaped_uri, - XBEL_ADDED_ATTRIBUTE, added, - XBEL_MODIFIED_ATTRIBUTE, modified, - XBEL_VISITED_ATTRIBUTE, visited); + + buffer = g_strconcat (" <" + XBEL_BOOKMARK_ELEMENT + " " + XBEL_HREF_ATTRIBUTE "=\"", escaped_uri, "\" " + XBEL_ADDED_ATTRIBUTE "=\"", added, "\" " + XBEL_MODIFIED_ATTRIBUTE "=\"", modified, "\" " + XBEL_VISITED_ATTRIBUTE "=\"", visited, "\">\n", + NULL); + + g_string_append (retval, buffer); + g_free (escaped_uri); g_free (visited); g_free (modified); g_free (added); + g_free (buffer); if (item->title) { gchar *escaped_title; escaped_title = g_markup_escape_text (item->title, -1); - g_string_append_printf (retval, - " <%s>%s\n", - XBEL_TITLE_ELEMENT, - escaped_title, - XBEL_TITLE_ELEMENT); + buffer = g_strconcat (" " + "<" XBEL_TITLE_ELEMENT ">", + escaped_title, + "\n", + NULL); + g_string_append (retval, buffer); + g_free (escaped_title); + g_free (buffer); } if (item->description) @@ -549,34 +568,38 @@ bookmark_item_dump (BookmarkItem *item) gchar *escaped_desc; escaped_desc = g_markup_escape_text (item->description, -1); - g_string_append_printf (retval, - " <%s>%s\n", - XBEL_DESC_ELEMENT, - escaped_desc, - XBEL_DESC_ELEMENT); + buffer = g_strconcat (" " + "<" XBEL_DESC_ELEMENT ">", + escaped_desc, + "\n", + NULL); + g_string_append (retval, buffer); + g_free (escaped_desc); + g_free (buffer); } if (item->metadata) { gchar *metadata; - /* open info container */ - g_string_append_printf (retval, " <%s>\n", XBEL_INFO_ELEMENT); - metadata = bookmark_metadata_dump (item->metadata); if (metadata) { - retval = g_string_append (retval, metadata); + buffer = g_strconcat (" " + "<" XBEL_INFO_ELEMENT ">\n", + metadata, + " " + "\n", + NULL); + retval = g_string_append (retval, buffer); + g_free (buffer); g_free (metadata); } - - /* close info container */ - g_string_append_printf (retval, " \n", XBEL_INFO_ELEMENT); } - - g_string_append_printf (retval, " \n", XBEL_BOOKMARK_ELEMENT); + + g_string_append (retval, " \n"); return g_string_free (retval, FALSE); } @@ -1435,56 +1458,53 @@ g_bookmark_file_dump (GBookmarkFile *bookmark, GError **error) { GString *retval; + gchar *buffer; GList *l; - retval = g_string_new (NULL); - - g_string_append_printf (retval, - "\n" + retval = g_string_sized_new (4096); + + g_string_append (retval, + "\n" #if 0 - /* XXX - do we really need the doctype? */ - "\n" + /* XXX - do we really need the doctype? */ + "\n" #endif - "<%s %s=\"%s\"\n" - " xmlns:%s=\"%s\"\n" - " xmlns:%s=\"%s\"\n>", -#if 0 - /* XXX - do we really need the doctype? */ - XBEL_DTD_NICK, - XBEL_DTD_SYSTEM, XBEL_DTD_URI, -#endif - XBEL_ROOT_ELEMENT, - XBEL_VERSION_ATTRIBUTE, XBEL_VERSION, - BOOKMARK_NAMESPACE_NAME, BOOKMARK_NAMESPACE_URI, - MIME_NAMESPACE_NAME, MIME_NAMESPACE_URI); + "<" XBEL_ROOT_ELEMENT " " XBEL_VERSION_ATTRIBUTE "=\"" XBEL_VERSION "\"\n" + " xmlns:" BOOKMARK_NAMESPACE_NAME "=\"" BOOKMARK_NAMESPACE_URI "\"\n" + " xmlns:" MIME_NAMESPACE_NAME "=\"" MIME_NAMESPACE_URI "\"\n>"); if (bookmark->title) { gchar *escaped_title; - + escaped_title = g_markup_escape_text (bookmark->title, -1); + + buffer = g_strconcat (" " + "<" XBEL_TITLE_ELEMENT ">", + escaped_title, + "\n", NULL); - g_string_append_printf (retval, " <%s>%s\n", - XBEL_TITLE_ELEMENT, - escaped_title, - XBEL_TITLE_ELEMENT); - + g_string_append (retval, buffer); + + g_free (buffer); g_free (escaped_title); } if (bookmark->description) { gchar *escaped_desc; - + escaped_desc = g_markup_escape_text (bookmark->description, -1); - - g_string_append_printf (retval, " <%s>%s\n", - XBEL_DESC_ELEMENT, - escaped_desc, - XBEL_DESC_ELEMENT); - + + buffer = g_strconcat (" " + "<" XBEL_DESC_ELEMENT ">", + escaped_desc, + "\n", NULL); + g_string_append (retval, buffer); + + g_free (buffer); g_free (escaped_desc); } @@ -1510,7 +1530,7 @@ g_bookmark_file_dump (GBookmarkFile *bookmark, } out: - g_string_append_printf (retval, "", XBEL_ROOT_ELEMENT); + g_string_append (retval, ""); if (length) *length = retval->len; @@ -3271,7 +3291,7 @@ expand_exec_line (const gchar *exec_fmt, GString *exec; gchar ch; - exec = g_string_new (NULL); + exec = g_string_sized_new (512); while ((ch = *exec_fmt++) != '\0') { if (ch != '%')