Bug 523877 – gbookmarkfile: avoid using g_string_append_printf() and

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)


svn path=/trunk/; revision=6752
This commit is contained in:
Claudio Saavedra 2008-03-22 23:52:39 +00:00 committed by Claudio Saavedra
parent c14b3842f2
commit 05b1004080
2 changed files with 144 additions and 111 deletions

View File

@ -1,3 +1,16 @@
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)
2008-03-22 Emmanuele Bassi <ebassi@gnome.org> 2008-03-22 Emmanuele Bassi <ebassi@gnome.org>
Bug 518160 - replace two g_strdup_printf calls in GBookmarkFile Bug 518160 - replace two g_strdup_printf calls in GBookmarkFile

View File

@ -339,56 +339,62 @@ static gchar *
bookmark_metadata_dump (BookmarkMetadata *metadata) bookmark_metadata_dump (BookmarkMetadata *metadata)
{ {
GString *retval; GString *retval;
gchar *buffer;
if (!metadata->applications) if (!metadata->applications)
return NULL; return NULL;
retval = g_string_new (NULL); retval = g_string_sized_new (1024);
/* metadata container */ /* metadata container */
g_string_append_printf (retval, g_string_append (retval,
" <%s %s=\"%s\">\n", " "
XBEL_METADATA_ELEMENT, "<" XBEL_METADATA_ELEMENT
XBEL_OWNER_ATTRIBUTE, BOOKMARK_METADATA_OWNER); " " XBEL_OWNER_ATTRIBUTE "=\"" BOOKMARK_METADATA_OWNER
"\">\n");
/* mime type */ /* mime type */
if (metadata->mime_type) if (metadata->mime_type) {
g_string_append_printf (retval, buffer = g_strconcat (" "
" <%s:%s %s=\"%s\"/>\n", "<" MIME_NAMESPACE_NAME ":" MIME_TYPE_ELEMENT " "
MIME_NAMESPACE_NAME, MIME_TYPE_ATTRIBUTE "=\"", metadata->mime_type, "\"/>\n",
MIME_TYPE_ELEMENT, NULL);
MIME_TYPE_ATTRIBUTE, metadata->mime_type); g_string_append (retval, buffer);
g_free (buffer);
}
if (metadata->groups) if (metadata->groups)
{ {
GList *l; GList *l;
/* open groups container */ /* open groups container */
g_string_append_printf (retval, g_string_append (retval,
" <%s:%s>\n", " "
BOOKMARK_NAMESPACE_NAME, "<" BOOKMARK_NAMESPACE_NAME
BOOKMARK_GROUPS_ELEMENT); ":" BOOKMARK_GROUPS_ELEMENT ">\n");
for (l = g_list_last (metadata->groups); l != NULL; l = l->prev) for (l = g_list_last (metadata->groups); l != NULL; l = l->prev)
{ {
gchar *group_name; gchar *group_name;
group_name = g_markup_escape_text ((gchar *) l->data, -1); group_name = g_markup_escape_text ((gchar *) l->data, -1);
g_string_append_printf (retval, buffer = g_strconcat (" "
" <%s:%s>%s</%s:%s>\n", "<" BOOKMARK_NAMESPACE_NAME
BOOKMARK_NAMESPACE_NAME, ":" BOOKMARK_GROUP_ELEMENT ">",
BOOKMARK_GROUP_ELEMENT, group_name,
group_name, "</" BOOKMARK_NAMESPACE_NAME
BOOKMARK_NAMESPACE_NAME, ":" BOOKMARK_GROUP_ELEMENT ">\n", NULL);
BOOKMARK_GROUP_ELEMENT); g_string_append (retval, buffer);
g_free (buffer);
g_free (group_name); g_free (group_name);
} }
/* close groups container */ /* close groups container */
g_string_append_printf (retval, g_string_append (retval,
" </%s:%s>\n", " "
BOOKMARK_NAMESPACE_NAME, "</" BOOKMARK_NAMESPACE_NAME
BOOKMARK_GROUPS_ELEMENT); ":" BOOKMARK_GROUPS_ELEMENT ">\n");
} }
if (metadata->applications) if (metadata->applications)
@ -396,10 +402,10 @@ bookmark_metadata_dump (BookmarkMetadata *metadata)
GList *l; GList *l;
/* open applications container */ /* open applications container */
g_string_append_printf (retval, g_string_append (retval,
" <%s:%s>\n", " "
BOOKMARK_NAMESPACE_NAME, "<" BOOKMARK_NAMESPACE_NAME
BOOKMARK_APPLICATIONS_ELEMENT); ":" BOOKMARK_APPLICATIONS_ELEMENT ">\n");
for (l = g_list_last (metadata->applications); l != NULL; l = l->prev) for (l = g_list_last (metadata->applications); l != NULL; l = l->prev)
{ {
@ -419,10 +425,10 @@ bookmark_metadata_dump (BookmarkMetadata *metadata)
} }
/* close applications container */ /* close applications container */
g_string_append_printf (retval, g_string_append (retval,
" </%s:%s>\n", " "
BOOKMARK_NAMESPACE_NAME, "</" BOOKMARK_NAMESPACE_NAME
BOOKMARK_APPLICATIONS_ELEMENT); ":" BOOKMARK_APPLICATIONS_ELEMENT ">\n");
} }
/* icon */ /* icon */
@ -431,23 +437,27 @@ bookmark_metadata_dump (BookmarkMetadata *metadata)
if (!metadata->icon_mime) if (!metadata->icon_mime)
metadata->icon_mime = g_strdup ("application/octet-stream"); metadata->icon_mime = g_strdup ("application/octet-stream");
g_string_append_printf (retval, buffer = g_strconcat (" "
" <%s:%s %s=\"%s\" %s=\"%s\"/>\n", "<" BOOKMARK_NAMESPACE_NAME
BOOKMARK_NAMESPACE_NAME, ":" BOOKMARK_ICON_ELEMENT
BOOKMARK_ICON_ELEMENT, " " BOOKMARK_HREF_ATTRIBUTE "=\"", metadata->icon_href,
BOOKMARK_HREF_ATTRIBUTE, metadata->icon_href, "\" " BOOKMARK_TYPE_ATTRIBUTE "=\"", metadata->icon_mime, "\"/>\n", NULL);
BOOKMARK_TYPE_ATTRIBUTE, metadata->icon_mime); g_string_append (retval, buffer);
g_free (buffer);
} }
/* private hint */ /* private hint */
if (metadata->is_private) if (metadata->is_private)
g_string_append_printf (retval, g_string_append (retval,
" <%s:%s/>\n", " "
BOOKMARK_NAMESPACE_NAME, "<" BOOKMARK_NAMESPACE_NAME
BOOKMARK_PRIVATE_ELEMENT); ":" BOOKMARK_PRIVATE_ELEMENT "/>\n");
/* close metadata container */ /* 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); return g_string_free (retval, FALSE);
} }
@ -501,6 +511,7 @@ bookmark_item_dump (BookmarkItem *item)
GString *retval; GString *retval;
gchar *added, *visited, *modified; gchar *added, *visited, *modified;
gchar *escaped_uri; gchar *escaped_uri;
gchar *buffer;
/* at this point, we must have at least a registered application; if we don't /* 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 * we don't screw up the bookmark file, and just skip this item
@ -511,7 +522,7 @@ bookmark_item_dump (BookmarkItem *item)
return NULL; return NULL;
} }
retval = g_string_new (NULL); retval = g_string_sized_new (4096);
added = timestamp_to_iso8601 (item->added); added = timestamp_to_iso8601 (item->added);
modified = timestamp_to_iso8601 (item->modified); modified = timestamp_to_iso8601 (item->modified);
@ -519,29 +530,37 @@ bookmark_item_dump (BookmarkItem *item)
escaped_uri = g_markup_escape_text (item->uri, -1); escaped_uri = g_markup_escape_text (item->uri, -1);
g_string_append_printf (retval, buffer = g_strconcat (" <"
" <%s %s=\"%s\" %s=\"%s\" %s=\"%s\" %s=\"%s\">\n", XBEL_BOOKMARK_ELEMENT
XBEL_BOOKMARK_ELEMENT, " "
XBEL_HREF_ATTRIBUTE, escaped_uri, XBEL_HREF_ATTRIBUTE "=\"", escaped_uri, "\" "
XBEL_ADDED_ATTRIBUTE, added, XBEL_ADDED_ATTRIBUTE "=\"", added, "\" "
XBEL_MODIFIED_ATTRIBUTE, modified, XBEL_MODIFIED_ATTRIBUTE "=\"", modified, "\" "
XBEL_VISITED_ATTRIBUTE, visited); XBEL_VISITED_ATTRIBUTE "=\"", visited, "\">\n",
NULL);
g_string_append (retval, buffer);
g_free (escaped_uri); g_free (escaped_uri);
g_free (visited); g_free (visited);
g_free (modified); g_free (modified);
g_free (added); g_free (added);
g_free (buffer);
if (item->title) if (item->title)
{ {
gchar *escaped_title; gchar *escaped_title;
escaped_title = g_markup_escape_text (item->title, -1); escaped_title = g_markup_escape_text (item->title, -1);
g_string_append_printf (retval, buffer = g_strconcat (" "
" <%s>%s</%s>\n", "<" XBEL_TITLE_ELEMENT ">",
XBEL_TITLE_ELEMENT, escaped_title,
escaped_title, "</" XBEL_TITLE_ELEMENT ">\n",
XBEL_TITLE_ELEMENT); NULL);
g_string_append (retval, buffer);
g_free (escaped_title); g_free (escaped_title);
g_free (buffer);
} }
if (item->description) if (item->description)
@ -549,34 +568,38 @@ bookmark_item_dump (BookmarkItem *item)
gchar *escaped_desc; gchar *escaped_desc;
escaped_desc = g_markup_escape_text (item->description, -1); escaped_desc = g_markup_escape_text (item->description, -1);
g_string_append_printf (retval, buffer = g_strconcat (" "
" <%s>%s</%s>\n", "<" XBEL_DESC_ELEMENT ">",
XBEL_DESC_ELEMENT, escaped_desc,
escaped_desc, "</" XBEL_DESC_ELEMENT ">\n",
XBEL_DESC_ELEMENT); NULL);
g_string_append (retval, buffer);
g_free (escaped_desc); g_free (escaped_desc);
g_free (buffer);
} }
if (item->metadata) if (item->metadata)
{ {
gchar *metadata; gchar *metadata;
/* open info container */
g_string_append_printf (retval, " <%s>\n", XBEL_INFO_ELEMENT);
metadata = bookmark_metadata_dump (item->metadata); metadata = bookmark_metadata_dump (item->metadata);
if (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); 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); return g_string_free (retval, FALSE);
} }
@ -1435,30 +1458,22 @@ g_bookmark_file_dump (GBookmarkFile *bookmark,
GError **error) GError **error)
{ {
GString *retval; GString *retval;
gchar *buffer;
GList *l; GList *l;
retval = g_string_new (NULL); retval = g_string_sized_new (4096);
g_string_append_printf (retval, g_string_append (retval,
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
#if 0 #if 0
/* XXX - do we really need the doctype? */ /* XXX - do we really need the doctype? */
"<!DOCTYPE %s\n" "<!DOCTYPE " XBEL_DTD_NICK "\n"
" PUBLIC \"%s\"\n" " PUBLIC \"" XBEL_DTD_SYSTEM "\"\n"
" \"%s\">\n" " \"" XBEL_DTD_URI "\">\n"
#endif #endif
"<%s %s=\"%s\"\n" "<" XBEL_ROOT_ELEMENT " " XBEL_VERSION_ATTRIBUTE "=\"" XBEL_VERSION "\"\n"
" xmlns:%s=\"%s\"\n" " xmlns:" BOOKMARK_NAMESPACE_NAME "=\"" BOOKMARK_NAMESPACE_URI "\"\n"
" xmlns:%s=\"%s\"\n>", " xmlns:" MIME_NAMESPACE_NAME "=\"" MIME_NAMESPACE_URI "\"\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);
if (bookmark->title) if (bookmark->title)
{ {
@ -1466,11 +1481,14 @@ g_bookmark_file_dump (GBookmarkFile *bookmark,
escaped_title = g_markup_escape_text (bookmark->title, -1); escaped_title = g_markup_escape_text (bookmark->title, -1);
g_string_append_printf (retval, " <%s>%s</%s>\n", buffer = g_strconcat (" "
XBEL_TITLE_ELEMENT, "<" XBEL_TITLE_ELEMENT ">",
escaped_title, escaped_title,
XBEL_TITLE_ELEMENT); "</" XBEL_TITLE_ELEMENT ">\n", NULL);
g_string_append (retval, buffer);
g_free (buffer);
g_free (escaped_title); g_free (escaped_title);
} }
@ -1480,11 +1498,13 @@ g_bookmark_file_dump (GBookmarkFile *bookmark,
escaped_desc = g_markup_escape_text (bookmark->description, -1); escaped_desc = g_markup_escape_text (bookmark->description, -1);
g_string_append_printf (retval, " <%s>%s</%s>\n", buffer = g_strconcat (" "
XBEL_DESC_ELEMENT, "<" XBEL_DESC_ELEMENT ">",
escaped_desc, escaped_desc,
XBEL_DESC_ELEMENT); "</" XBEL_DESC_ELEMENT ">\n", NULL);
g_string_append (retval, buffer);
g_free (buffer);
g_free (escaped_desc); g_free (escaped_desc);
} }
@ -1510,7 +1530,7 @@ g_bookmark_file_dump (GBookmarkFile *bookmark,
} }
out: out:
g_string_append_printf (retval, "</%s>", XBEL_ROOT_ELEMENT); g_string_append (retval, "</" XBEL_ROOT_ELEMENT ">");
if (length) if (length)
*length = retval->len; *length = retval->len;
@ -3271,7 +3291,7 @@ expand_exec_line (const gchar *exec_fmt,
GString *exec; GString *exec;
gchar ch; gchar ch;
exec = g_string_new (NULL); exec = g_string_sized_new (512);
while ((ch = *exec_fmt++) != '\0') while ((ch = *exec_fmt++) != '\0')
{ {
if (ch != '%') if (ch != '%')