Introduction
Introduction Statistics Contact Development Disclaimer Help
sfeed.c: optimize tag lookup by reverting the binary search to a linear lookup …
git clone git://git.codemadness.org/sfeed
Log
Files
Refs
README
LICENSE
---
commit 4d445d3e47de2d3e5b101c1a6520690d306a5d6c
parent c2231c4b4f91a86df6192c9830235f3ca499810e
Author: Hiltjo Posthuma <[email protected]>
Date: Tue, 7 Jan 2025 19:51:15 +0100
sfeed.c: optimize tag lookup by reverting the binary search to a linear lookup
This removes an intended optimization.
It was changed to bsearch() in commit 3031d855807de20fc86cd3dd2375ce9473e86947
After some more testing: because the tags table is so small doing a linear scan
over the table by first checking the length, and then (if needed) the tag name
comparison is bit faster (6-11%), but of course depends on the input) in common
cases than a binary search.
In practise there is no noticable difference though.
This simplifies the code a bit.
Diffstat:
M sfeed.c | 33 +++++++++++++++--------------…
1 file changed, 16 insertions(+), 17 deletions(-)
---
diff --git a/sfeed.c b/sfeed.c
@@ -125,7 +125,7 @@ static void xmltagstart(XMLParser *, const char *, size_t);
static void xmltagstartparsed(XMLParser *, const char *, size_t, int);
/* map tag name to TagId type */
-/* RSS, must be alphabetical order */
+/* RSS, keep this in alphabetical order */
static const FeedTag rsstags[] = {
{ STRP("author"), RSSTagAuthor },
{ STRP("category"), RSSTagCategory },
@@ -142,7 +142,7 @@ static const FeedTag rsstags[] = {
{ STRP("title"), RSSTagTitle }
};
-/* Atom, must be alphabetical order */
+/* Atom, keep this in alphabetical order */
static const FeedTag atomtags[] = {
{ STRP("author"), AtomTagAuthor },
{ STRP("category"), AtomTagCategory },
@@ -212,34 +212,33 @@ static FeedContext ctx;
static XMLParser parser; /* XML parser state */
static String attrispermalink, attrrel, attrtype, tmpstr;
-static int
-tagcmp(const void *v1, const void *v2)
-{
- return strcasecmp(((FeedTag *)v1)->name, ((FeedTag *)v2)->name);
-}
-
-/* Unique tagid for parsed tag name. */
+/* Unique tag(id) for parsed tag name. */
static FeedTag *
gettag(enum FeedType feedtype, const char *name, size_t namelen)
{
- FeedTag f, *r = NULL;
-
- f.name = (char *)name;
+ FeedTag *r;
+ size_t i;
switch (feedtype) {
case FeedTypeRSS:
- r = bsearch(&f, rsstags, sizeof(rsstags) / sizeof(rsstags[0]),
- sizeof(rsstags[0]), tagcmp);
+ for (i = 0; i < sizeof(rsstags) / sizeof(rsstags[0]); i++) {
+ r = (FeedTag *)&rsstags[i];
+ if (r->len == namelen && !strcasecmp(r->name, name))
+ return r;
+ }
break;
case FeedTypeAtom:
- r = bsearch(&f, atomtags, sizeof(atomtags) / sizeof(atomtags[0…
- sizeof(atomtags[0]), tagcmp);
+ for (i = 0; i < sizeof(atomtags) / sizeof(atomtags[0]); i++) {
+ r = (FeedTag *)&atomtags[i];
+ if (r->len == namelen && !strcasecmp(r->name, name))
+ return r;
+ }
break;
default:
break;
}
- return r;
+ return NULL;
}
static char *
You are viewing proxied material from codemadness.org. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.