From 365b1b3592fd222ad0af74071ca4e81cd98b1f71 Mon Sep 17 00:00:00 2001 From: Xiaole He Date: Sun, 16 Oct 2022 06:47:03 +0000 Subject: [PATCH] abg-reader: optimize if construction In 'build_enum_type_decl' function of 'src/abg-reader.cc', the 'for loop' walk through all the child nodes of the '' for seeking '' and '': /* original src/abg-reader.cc begin */ static enum_type_decl_sptr build_enum_type_decl(read_context& ctxt, const xmlNodePtr node, bool add_to_current_scope) { ... for (xmlNodePtr n = xmlFirstElementChild(node); n; n = xmlNextElementSibling(n)) { if (xmlStrEqual(n->name, BAD_CAST("underlying-type"))) { ... } if (xmlStrEqual(n->name, BAD_CAST("enumerator"))) { ... } } ... } /* original src/abg-reader.cc end */ Here uses 2 separate 'if' statements for seeking, that is, for any child node of the '', there involves 2 'if' comparations. Because the child node of the '' is either '' or '', there would be a slight optimization when use 'if-else if' construction instead, like below: /* optimized src/abg-reader.cc begin */ for (xmlNodePtr n = xmlFirstElementChild(node); n; n = xmlNextElementSibling(n)) { if (xmlStrEqual(n->name, BAD_CAST("underlying-type"))) { ... } else if (xmlStrEqual(n->name, BAD_CAST("enumerator"))) { ... } } /* optimized src/abg-reader.cc end */ Supposing there has the test case: /* test case begin */ /* test case end */ When parsing the '' xml tag, for the original 'src/abg-reader.cc', there involves 2 'if' comparations. But involves only 1 'if' comparation for the optimized 'src/abg-reader.cc'. Signed-off-by: Xiaole He Tested-by: Xiaole He Signed-off-by: Dodji Seketeli --- src/abg-reader.cc | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/abg-reader.cc b/src/abg-reader.cc index b55808b9..4afa427a 100644 --- a/src/abg-reader.cc +++ b/src/abg-reader.cc @@ -4602,8 +4602,7 @@ build_enum_type_decl(read_context& ctxt, base_type_id = CHAR_STR(a); continue; } - - if (xmlStrEqual(n->name, BAD_CAST("enumerator"))) + else if (xmlStrEqual(n->name, BAD_CAST("enumerator"))) { string name; int64_t value = 0;