2008-11-05 Wim Taymans <wim.taymans@collabora.co.uk>
+ * 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 <wim.taymans@collabora.co.uk>
+
* docs/design/part-TODO.txt:
Mumble something about removing GstXML.
{
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);
* 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)
{
+ /* the basic int, string, double types */
+ if (type <= G_TYPE_MAKE_FUNDAMENTAL (G_TYPE_RESERVED_GLIB_LAST)) {
+ return TRUE;
+ }
+ /* 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_LIST || type == GST_TYPE_FRACTION_RANGE) {
return FALSE;
}
- if (G_TYPE_FUNDAMENTAL (type) <=
- G_TYPE_MAKE_FUNDAMENTAL (G_TYPE_RESERVED_GLIB_LAST)) {
+ /* other (boxed) types that are fixed */
+ if (type == GST_TYPE_BUFFER) {
return TRUE;
}
- if (type == GST_TYPE_BUFFER || type == GST_TYPE_FOURCC
- || type == GST_TYPE_ARRAY || type == GST_TYPE_FRACTION) {
+ /* heavy checks */
+ if (G_TYPE_IS_FUNDAMENTAL (type) || G_TYPE_FUNDAMENTAL (type) <=
+ G_TYPE_MAKE_FUNDAMENTAL (G_TYPE_RESERVED_GLIB_LAST)) {
return TRUE;
}
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) {