glib/gvarianttype: g_variant_type_is_subtype_of() fastpath

This adds a fastpath for the extremely common case of checking if a
GVariant type is a subtype of itself _and_ a definite basic type. For
example, checking 'i' against 'i' or 's' against 's'.

In a loop using GVariantBuilder this can cut the cost of this function
alone in half on profiles from 3.3% of samples to 1.7% of samples.
This commit is contained in:
Christian Hergert 2024-09-21 09:49:47 -07:00
parent 84b6f747cb
commit 7d4ea04ee2

View File

@ -867,6 +867,24 @@ g_variant_type_is_subtype_of (const GVariantType *type,
supertype_string = g_variant_type_peek_string (supertype);
type_string = g_variant_type_peek_string (type);
/* fast path for the basic determinate types */
if (type_string[0] == supertype_string[0])
{
switch (type_string[0])
{
case 'b': case 'y':
case 'n': case 'q':
case 'i': case 'h': case 'u':
case 't': case 'x':
case 's': case 'o': case 'g':
case 'd':
return TRUE;
default:
break;
}
}
supertype_end = supertype_string +
g_variant_type_get_string_length (supertype);