From 7d4ea04ee218e0c1308de95c0deba42946fddfc0 Mon Sep 17 00:00:00 2001 From: Christian Hergert Date: Sat, 21 Sep 2024 09:49:47 -0700 Subject: [PATCH] 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. --- glib/gvarianttype.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/glib/gvarianttype.c b/glib/gvarianttype.c index 3d8c0ae81..75ce4b4aa 100644 --- a/glib/gvarianttype.c +++ b/glib/gvarianttype.c @@ -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);