glib2/glib2-bnc373149-bgo523877-gbookmark-optimizations.diff

412 lines
13 KiB
Diff
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

https://bugzilla.novell.com/show_bug.cgi?id=373149 backport glib performance patches for GBookmark
2008-03-22 Claudio Saavedra <csaavedra@gnome.org>
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)
git-svn-id: svn+ssh://svn.gnome.org/svn/glib/trunk@6752 5bbd4a9e-d125-0410-bf1d-f987e7eefc80
diff --git a/glib/gbookmarkfile.c b/glib/gbookmarkfile.c
index 5cf320d..70ce6ee 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</%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,
+ "</" BOOKMARK_NAMESPACE_NAME
+ ":" BOOKMARK_GROUP_ELEMENT ">\n", NULL);
+ g_string_append (retval, buffer);
+
+ g_free (buffer);
g_free (group_name);
}
/* close 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");
}
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,
- " </%s:%s>\n",
- BOOKMARK_NAMESPACE_NAME,
- BOOKMARK_APPLICATIONS_ELEMENT);
+ g_string_append (retval,
+ " "
+ "</" BOOKMARK_NAMESPACE_NAME
+ ":" BOOKMARK_APPLICATIONS_ELEMENT ">\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, " </%s>\n", XBEL_METADATA_ELEMENT);
+ g_string_append (retval,
+ " "
+ "</" XBEL_METADATA_ELEMENT ">\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</%s>\n",
- XBEL_TITLE_ELEMENT,
- escaped_title,
- XBEL_TITLE_ELEMENT);
+ buffer = g_strconcat (" "
+ "<" XBEL_TITLE_ELEMENT ">",
+ escaped_title,
+ "</" XBEL_TITLE_ELEMENT ">\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</%s>\n",
- XBEL_DESC_ELEMENT,
- escaped_desc,
- XBEL_DESC_ELEMENT);
+ buffer = g_strconcat (" "
+ "<" XBEL_DESC_ELEMENT ">",
+ escaped_desc,
+ "</" XBEL_DESC_ELEMENT ">\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,
+ " "
+ "</" XBEL_INFO_ELEMENT ">\n",
+ NULL);
+ retval = g_string_append (retval, buffer);
+ g_free (buffer);
g_free (metadata);
}
-
- /* close info container */
- g_string_append_printf (retval, " </%s>\n", XBEL_INFO_ELEMENT);
}
-
- g_string_append_printf (retval, " </%s>\n", XBEL_BOOKMARK_ELEMENT);
+
+ g_string_append (retval, " </" XBEL_BOOKMARK_ELEMENT ">\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,
- "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
-#if 0
- /* XXX - do we really need the doctype? */
- "<!DOCTYPE %s\n"
- " PUBLIC \"%s\"\n"
- " \"%s\">\n"
-#endif
- "<%s %s=\"%s\"\n"
- " xmlns:%s=\"%s\"\n"
- " xmlns:%s=\"%s\"\n>",
+ retval = g_string_sized_new (4096);
+
+ g_string_append (retval,
+ "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
#if 0
- /* XXX - do we really need the doctype? */
- XBEL_DTD_NICK,
- XBEL_DTD_SYSTEM, XBEL_DTD_URI,
+ /* XXX - do we really need the doctype? */
+ "<!DOCTYPE " XBEL_DTD_NICK "\n"
+ " PUBLIC \"" XBEL_DTD_SYSTEM "\"\n"
+ " \"" XBEL_DTD_URI "\">\n"
#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,
+ "</" XBEL_TITLE_ELEMENT ">\n", NULL);
- g_string_append_printf (retval, " <%s>%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</%s>\n",
- XBEL_DESC_ELEMENT,
- escaped_desc,
- XBEL_DESC_ELEMENT);
-
+
+ buffer = g_strconcat (" "
+ "<" XBEL_DESC_ELEMENT ">",
+ escaped_desc,
+ "</" XBEL_DESC_ELEMENT ">\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, "</%s>", XBEL_ROOT_ELEMENT);
+ g_string_append (retval, "</" XBEL_ROOT_ELEMENT ">");
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 != '%')