Use faster string functions at startup.

Use wmem_strconcat and g_strconcat instead of wmem_strdup_printf and
g_strdup_printf when we register various protocols. This shows a fairly
significant speedup in the Visual Studio profiler.

Change-Id: I98709329513daa66ad3665925dc69149c43df884
Reviewed-on: https://code.wireshark.org/review/14855
Petri-Dish: Gerald Combs <gerald@wireshark.org>
Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org>
Reviewed-by: Gerald Combs <gerald@wireshark.org>
This commit is contained in:
Gerald Combs 2016-04-07 13:05:27 -07:00
parent 71f2b6e1b4
commit 90e1232672
4 changed files with 35 additions and 23 deletions

View File

@ -14046,6 +14046,7 @@ void
proto_reg_handoff_btatt(void)
{
gint i_array;
GString *uuid_str = g_string_new("");
http_handle = find_dissector_add_dependency("http", proto_btatt);
usb_hid_boot_keyboard_input_report_handle = find_dissector_add_dependency("usbhid.boot_report.keyboard.input", proto_btatt);
@ -14072,18 +14073,19 @@ proto_reg_handoff_btatt(void)
continue;
}
name = wmem_strdup_printf(wmem_epan_scope(), "Bluetooth GATT Attribute %s (UUID 0x%04x)",
bluetooth_uuid_vals[i_array].strptr, bluetooth_uuid_vals[i_array].value);
short_name = wmem_strdup_printf(wmem_epan_scope(), "BT GATT %s (UUID 0x%04x)",
bluetooth_uuid_vals[i_array].strptr, bluetooth_uuid_vals[i_array].value);
abbrev = wmem_strdup_printf(wmem_epan_scope(), "btgatt.uuid0x%04x",
bluetooth_uuid_vals[i_array].value);
g_string_printf(uuid_str, "0x%04x", bluetooth_uuid_vals[i_array].value);
name = wmem_strconcat(wmem_epan_scope(), "Bluetooth GATT Attribute ",
bluetooth_uuid_vals[i_array].strptr, " (UUID ", uuid_str->str, ")", NULL);
short_name = wmem_strconcat(wmem_epan_scope(), "BT GATT ",
bluetooth_uuid_vals[i_array].strptr, " (UUID ", uuid_str->str, ")", NULL);
abbrev = wmem_strconcat(wmem_epan_scope(), "btgatt.uuid", uuid_str->str, NULL);
proto_tmp = proto_register_protocol(name, short_name, abbrev);
handle_tmp = register_dissector(abbrev, dissect_btgatt, proto_tmp);
dissector_add_for_decode_as("btatt.handle", handle_tmp);
}
g_string_free(uuid_str, TRUE);
}
void

View File

@ -1654,20 +1654,20 @@ build_address_avp(const avp_type_t *type _U_, guint32 code,
basic_avp_reginfo(a, name, FT_BYTES, BASE_NONE, NULL);
reginfo(&(t->hf_address_type), wmem_strdup_printf(wmem_epan_scope(), "%s Address Family",name),
alnumerize(wmem_strdup_printf(wmem_epan_scope(), "diameter.%s.addr_family",name)),
reginfo(&(t->hf_address_type), wmem_strconcat(wmem_epan_scope(), name, " Address Family", NULL),
alnumerize(wmem_strconcat(wmem_epan_scope(), "diameter.", name, ".addr_family", NULL)),
NULL, FT_UINT16, (field_display_e)(BASE_DEC|BASE_EXT_STRING), &diameter_avp_data_addrfamily_vals_ext, 0);
reginfo(&(t->hf_ipv4), wmem_strdup_printf(wmem_epan_scope(), "%s Address",name),
alnumerize(wmem_strdup_printf(wmem_epan_scope(), "diameter.%s.IPv4",name)),
reginfo(&(t->hf_ipv4), wmem_strconcat(wmem_epan_scope(), name, " Address", NULL),
alnumerize(wmem_strconcat(wmem_epan_scope(), "diameter.", name, ".IPv4", NULL)),
NULL, FT_IPv4, BASE_NONE, NULL, 0);
reginfo(&(t->hf_ipv6), wmem_strdup_printf(wmem_epan_scope(), "%s Address",name),
alnumerize(wmem_strdup_printf(wmem_epan_scope(), "diameter.%s.IPv6",name)),
reginfo(&(t->hf_ipv6), wmem_strconcat(wmem_epan_scope(), name, " Address", NULL),
alnumerize(wmem_strconcat(wmem_epan_scope(), "diameter.", name, ".IPv6", NULL)),
NULL, FT_IPv6, BASE_NONE, NULL, 0);
reginfo(&(t->hf_other), wmem_strdup_printf(wmem_epan_scope(), "%s Address",name),
alnumerize(wmem_strdup_printf(wmem_epan_scope(), "diameter.%s.Bytes",name)),
reginfo(&(t->hf_other), wmem_strconcat(wmem_epan_scope(), name, " Address", NULL),
alnumerize(wmem_strconcat(wmem_epan_scope(), "diameter.", name, ".Bytes", NULL)),
NULL, FT_BYTES, BASE_NONE, NULL, 0);
g_ptr_array_add(build_dict.ett,ettp);
@ -1733,7 +1733,7 @@ build_simple_avp(const avp_type_t *type, guint32 code, diam_vnd_t *vendor,
while (vs[i].strptr) {
i++;
}
vs_ext = value_string_ext_new(vs, i+1, wmem_strdup_printf(wmem_epan_scope(), "%s_vals_ext",name));
vs_ext = value_string_ext_new(vs, i+1, wmem_strconcat(wmem_epan_scope(), name, "_vals_ext", NULL));
base = (field_display_e)(base|BASE_EXT_STRING);
}
@ -1899,6 +1899,7 @@ dictionary_load(void)
/* load the dictionary */
dir = g_strdup_printf("%s" G_DIR_SEPARATOR_S "diameter" G_DIR_SEPARATOR_S, get_datafile_dir());
/* XXX We don't call ddict_free anywhere. */
d = ddict_scan(dir,"dictionary.xml",do_debug_parser);
g_free(dir);
if (d == NULL) {
@ -1962,7 +1963,7 @@ dictionary_load(void)
dictionary.applications = value_string_ext_new((value_string *)wmem_array_get_raw(arr),
wmem_array_get_count(arr),
wmem_strdup_printf(wmem_epan_scope(), "applications_vals_ext"));
wmem_strdup(wmem_epan_scope(), "applications_vals_ext"));
}
if ((v = d->vendors)) {

View File

@ -210,7 +210,7 @@ dissect_xml(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
colinfo_str = "/XML";
} else {
char *colinfo_str_buf;
colinfo_str_buf = wmem_strdup_printf(wmem_packet_scope(), "/%s", root_ns->name);
colinfo_str_buf = wmem_strconcat(wmem_packet_scope(), "/", root_ns->name, NULL);
ascii_strup_inplace(colinfo_str_buf);
colinfo_str = colinfo_str_buf;
}
@ -832,7 +832,7 @@ static void add_xml_field(wmem_array_t *hfs, int *p_id, const gchar *name, const
static void add_xml_attribute_names(gpointer k, gpointer v, gpointer p)
{
struct _attr_reg_data *d = (struct _attr_reg_data *)p;
const gchar *basename = wmem_strdup_printf(wmem_epan_scope(), "%s.%s", d->basename, (gchar *)k);
const gchar *basename = wmem_strconcat(wmem_epan_scope(), d->basename, ".", (gchar *)k, NULL);
add_xml_field(d->hf, (int*) v, (gchar *)k, basename);
}
@ -841,7 +841,7 @@ static void add_xml_attribute_names(gpointer k, gpointer v, gpointer p)
static void add_xmlpi_namespace(gpointer k _U_, gpointer v, gpointer p)
{
xml_ns_t *ns = (xml_ns_t *)v;
const gchar *basename = wmem_strdup_printf(wmem_epan_scope(), "%s.%s", (gchar *)p, ns->name);
const gchar *basename = wmem_strconcat(wmem_epan_scope(), (gchar *)p, ".", ns->name, NULL);
gint *ett_p = &(ns->ett);
struct _attr_reg_data d;

View File

@ -437,7 +437,7 @@ static inline oid_kind_t smikind(SmiNode* sN, oid_key_t** key_p) {
oid1 = smiRenderOID(sN->oidlen, sN->oid, SMI_RENDER_QUALIFIED);
oid2 = smiRenderOID(elNode->oidlen, elNode->oid, SMI_RENDER_NAME);
k->name = g_strdup_printf("%s.%s", oid1, oid2);
k->name = g_strconcat(oid1, ".", oid2, NULL);
smi_free (oid1);
smi_free (oid2);
@ -696,8 +696,8 @@ static void register_mibs(void) {
bits->data[n].hfid = -1;
bits->data[n].offset = smiEnum->value.value.integer32 / 8;
hf2.hfinfo.name = g_strdup_printf("%s:%s",oid_data->name,smiEnum->name);
hf2.hfinfo.abbrev = g_strdup_printf("%s.%s",base,ext);
hf2.hfinfo.name = g_strconcat("%s:%s",oid_data->name, ":", smiEnum->name, NULL);
hf2.hfinfo.abbrev = g_strconcat(base, ".", ext, NULL);
g_free(base);
g_free(ext);
@ -872,7 +872,16 @@ char* rel_oid_subid2string(wmem_allocator_t *scope, guint32* subids, guint len,
*w++ = '.';
do {
#ifdef _WIN32
/*
* GLib appears to use gnulib's snprintf on Windows, which is
* slow. MSDN says that _snprintf can return -1, but that
* shouldn't be possible here.
*/
w += _snprintf(w,12,"%u.",*subids++);
#else
w += g_snprintf(w,12,"%u.",*subids++);
#endif
} while(--len);
if (w!=s) *(w-1) = '\0'; else *(s) = '\0';
@ -1212,7 +1221,7 @@ gchar *oid_resolved(wmem_allocator_t *scope, guint32 num_subids, guint32* subids
*str1 = oid_subid2string(NULL, subids,matched),
*str2 = oid_subid2string(NULL, &(subids[matched]),left);
ret = wmem_strdup_printf(scope, "%s.%s", oid->name ? oid->name : str1, str2);
ret = wmem_strconcat(scope, oid->name ? oid->name : str1, ".", str2, NULL);
wmem_free(NULL, str1);
wmem_free(NULL, str2);
return ret;