From 685e54f4dd7e8387f6fba3c691063021303ffe19 Mon Sep 17 00:00:00 2001 From: Zdenek Kabelac Date: Thu, 10 Mar 2011 14:51:35 +0000 Subject: [PATCH] Optimise _eat_space and _get_token Makes the code more readable and has a smaller number of memory accesses thus it's small optimisation as well. For _get_token() optimize number parsing. Check for '.' char only if it's not a digit. Move pointer incrementation into one place. For _eat_space() check only p->te for '\0' in skipping of comment line. Avoid check for '\0' when we know it is space. Also master while loop doesn't need checking p->tb for '\0'. We just need to check p->tb isn't already at the end of buffer. This could give 'extra' loop cycle if we are already there - but safes memory access in every other case. --- WHATS_NEW | 1 + lib/config/config.c | 42 +++++++++++++++++++++--------------------- 2 files changed, 22 insertions(+), 21 deletions(-) diff --git a/WHATS_NEW b/WHATS_NEW index d60f22668..42d74914b 100644 --- a/WHATS_NEW +++ b/WHATS_NEW @@ -1,5 +1,6 @@ Version 2.02.85 - =================================== + Optimise _get_token() and _eat_space(). Add _lv_postorder_vg() to improve efficiency for all LVs in VG. Use hash tables to speedup string search in validate_vg(). Refactor allocation of VG structure, add alloc_vg(). diff --git a/lib/config/config.c b/lib/config/config.c index e6e97cfe2..9fb2bf61d 100644 --- a/lib/config/config.c +++ b/lib/config/config.c @@ -822,18 +822,20 @@ static void _get_token(struct parser *p, int tok_prev) case '+': case '-': if (values_allowed) { - te++; - while ((te != p->fe) && (*te)) { - if (*te == '.') { - if (p->t == TOK_FLOAT) - break; - p->t = TOK_FLOAT; - } else if (!isdigit((int) *te)) + while (++te != p->fe) { + if (!isdigit((int) *te)) { + if (*te == '.') { + if (p->t != TOK_FLOAT) { + p->t = TOK_FLOAT; + continue; + } + } break; - te++; + } } break; } + /* fall through */ default: p->t = TOK_IDENTIFIER; @@ -850,21 +852,19 @@ static void _get_token(struct parser *p, int tok_prev) static void _eat_space(struct parser *p) { - while ((p->tb != p->fe) && (*p->tb)) { + while (p->tb != p->fe) { if (*p->te == '#') - while ((p->te != p->fe) && (*p->te) && (*p->te != '\n')) - p->te++; - - else if (isspace(*p->te)) { - while ((p->te != p->fe) && (*p->te) && isspace(*p->te)) { - if (*p->te == '\n') - p->line++; - p->te++; - } - } + while ((p->te != p->fe) && (*p->te != '\n') && (*p->te)) + ++p->te; - else - return; + else if (!isspace(*p->te)) + break; + + while ((p->te != p->fe) && isspace(*p->te)) { + if (*p->te == '\n') + ++p->line; + ++p->te; + } p->tb = p->te; } -- 2.43.5