From 209c57085c297db541905ab8891844a8c25e0c19 Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Wed, 5 Nov 2008 16:57:35 +0000 Subject: [PATCH] gst/gststructure.c: No need to memset, we can clear the value ourselves. Original commit message from CVS: * gst/gststructure.c: (gst_structure_id_empty_new_with_size): No need to memset, we can clear the value ourselves. * gst/gstvalue.c: (gst_type_is_fixed), (gst_value_get_compare_func): Some optimisations from a few callgrind sessions: When checking if a type is fixed, check for trivial fundamental types first before checking types for which we need to get the type followed by the heavy duty type checks, this reduces the amount of g_type_fundamental() calls a lot. When getting the compare function, first check for our registered types. If that fails, do the heavy duty g_type_is_a() checks, reduces the amount of g_type_is_a() considerably. --- ChangeLog | 16 ++++++++++++++++ gst/gststructure.c | 3 ++- gst/gstvalue.c | 36 ++++++++++++++++++++++++------------ 3 files changed, 42 insertions(+), 13 deletions(-) diff --git a/ChangeLog b/ChangeLog index db7bda2f1d..8f07f73dd6 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,19 @@ +2008-11-05 Wim Taymans + + * gst/gststructure.c: (gst_structure_id_empty_new_with_size): + No need to memset, we can clear the value ourselves. + + * gst/gstvalue.c: (gst_type_is_fixed), + (gst_value_get_compare_func): + Some optimisations from a few callgrind sessions: + When checking if a type is fixed, check for trivial fundamental types + first before checking types for which we need to get the type followed + by the heavy duty type checks, this reduces the amount of + g_type_fundamental() calls a lot. + When getting the compare function, first check for our registered types. + If that fails, do the heavy duty g_type_is_a() checks, reduces the + amount of g_type_is_a() considerably. + 2008-11-05 Wim Taymans * docs/design/part-TODO.txt: diff --git a/gst/gststructure.c b/gst/gststructure.c index 64501eed73..64efdb335b 100644 --- a/gst/gststructure.c +++ b/gst/gststructure.c @@ -113,9 +113,10 @@ gst_structure_id_empty_new_with_size (GQuark quark, guint prealloc) { GstStructure *structure; - structure = g_slice_new0 (GstStructure); + structure = g_slice_new (GstStructure); structure->type = gst_structure_get_type (); structure->name = quark; + structure->parent_refcount = NULL; structure->fields = g_array_sized_new (FALSE, TRUE, sizeof (GstStructureField), prealloc); diff --git a/gst/gstvalue.c b/gst/gstvalue.c index a2809e9f38..e26f750818 100644 --- a/gst/gstvalue.c +++ b/gst/gstvalue.c @@ -148,20 +148,25 @@ gst_value_transform_any_list_string (const GValue * src_value, * there. Do not export, since it doesn't work for types where the content * decides the fixedness (e.g. GST_TYPE_ARRAY). */ - static gboolean gst_type_is_fixed (GType type) { - if (type == GST_TYPE_INT_RANGE || type == GST_TYPE_DOUBLE_RANGE || - type == GST_TYPE_LIST) { - return FALSE; - } - if (G_TYPE_FUNDAMENTAL (type) <= - G_TYPE_MAKE_FUNDAMENTAL (G_TYPE_RESERVED_GLIB_LAST)) { + /* the basic int, string, double types */ + if (type <= G_TYPE_MAKE_FUNDAMENTAL (G_TYPE_RESERVED_GLIB_LAST)) { return TRUE; } - if (type == GST_TYPE_BUFFER || type == GST_TYPE_FOURCC - || type == GST_TYPE_ARRAY || type == GST_TYPE_FRACTION) { + /* our fundamental types that are certainly not fixed */ + if (type == GST_TYPE_INT_RANGE || type == GST_TYPE_DOUBLE_RANGE || + type == GST_TYPE_LIST || type == GST_TYPE_FRACTION_RANGE) { + return FALSE; + } + /* other (boxed) types that are fixed */ + if (type == GST_TYPE_BUFFER) { + return TRUE; + } + /* heavy checks */ + if (G_TYPE_IS_FUNDAMENTAL (type) || G_TYPE_FUNDAMENTAL (type) <= + G_TYPE_MAKE_FUNDAMENTAL (G_TYPE_RESERVED_GLIB_LAST)) { return TRUE; } @@ -2795,15 +2800,22 @@ gst_value_get_compare_func (const GValue * value1) GstValueTable *table, *best = NULL; guint i; + /* this is a fast check */ for (i = 0; i < gst_value_table->len; i++) { table = &g_array_index (gst_value_table, GstValueTable, i); if (table->type == G_VALUE_TYPE (value1) && table->compare != NULL) { best = table; break; } - if (g_type_is_a (G_VALUE_TYPE (value1), table->type)) { - if (!best || g_type_is_a (table->type, best->type)) - best = table; + } + /* slower checks */ + if (!best) { + for (i = 0; i < gst_value_table->len; i++) { + table = &g_array_index (gst_value_table, GstValueTable, i); + if (g_type_is_a (G_VALUE_TYPE (value1), table->type)) { + if (!best || g_type_is_a (table->type, best->type)) + best = table; + } } } if (best) {