commit:     2977f24478a673ff869bb6d26bf69b90b099deb5
Author:     Fabian Groffen <grobian <AT> gentoo <DOT> org>
AuthorDate: Fri May 10 15:31:00 2019 +0000
Commit:     Fabian Groffen <grobian <AT> gentoo <DOT> org>
CommitDate: Fri May 10 15:31:00 2019 +0000
URL:        https://gitweb.gentoo.org/proj/portage-utils.git/commit/?id=2977f244

qkeyword: optimise away redundant atom_explode calls

With some help from libq/tree now doing the sorting right (and
contructing an atom exactly once for each package) we can avoid
exploding atoms and greatly benefit in performance.  On my setup I've
seen timings half or even more.

Signed-off-by: Fabian Groffen <grobian <AT> gentoo.org>

 TODO.md    |  4 ----
 qkeyword.c | 47 +++++------------------------------------------
 2 files changed, 5 insertions(+), 46 deletions(-)

diff --git a/TODO.md b/TODO.md
index ec5f843..768c435 100644
--- a/TODO.md
+++ b/TODO.md
@@ -93,8 +93,4 @@
 - read VDB on -v to print details about current USE-flag status, bug #656550
 
 # qkeyword
-- avoid multiple atom\_explode in path traversal
-  * during qkeyword\_vercmp
-  * during qkeyword\_results\_cb
-  * in libq/cache\_read\_metadata
 - drop -c argument? it can be fully expressed using -p cat/

diff --git a/qkeyword.c b/qkeyword.c
index b9792af..fda9b83 100644
--- a/qkeyword.c
+++ b/qkeyword.c
@@ -191,28 +191,6 @@ read_keywords(char *s, int *keywords)
        return 0;
 }
 
-/*
- * Compare 2 struct dirent d_name strings based with atom_compare_str().
- * Used with dirscan() to sort ebuild filenames by version, reversed.
- *
- * IN:
- *  2 (const struct dirent **) with d_name filled in
- * OUT:
- *  -1 (NEWER)
- *   1 (OLDER)
- *   0 (SAME)
- */
-static int
-qkeyword_vercmp(const struct dirent **x, const struct dirent **y)
-{
-       switch (atom_compare_str((*x)->d_name, (*y)->d_name)) {
-               case EQUAL:      return  0;
-               case NEWER:      return -1;
-               case OLDER:      return  1;
-               default:         return strcmp((*x)->d_name, (*y)->d_name);
-       }
-}
-
 static int
 qkeyword_imlate(tree_pkg_ctx *pkg_ctx, void *priv)
 {
@@ -496,7 +474,7 @@ qkeyword_stats(tree_pkg_ctx *pkg_ctx, void *priv)
                numcat++;
        lastcat = pkg_ctx->cat_ctx->name;
 
-       atom = atom_explode(pkg_ctx->name);
+       atom = tree_get_atom(pkg_ctx, false);
        if (atom && strcmp(lastpkg, atom->PN) != 0) {
                for (a = 0; a < archlist_count; a++) {
                        switch (current_package_keywords[a]) {
@@ -515,7 +493,6 @@ qkeyword_stats(tree_pkg_ctx *pkg_ctx, void *priv)
                memset(current_package_keywords, 0,
                                archlist_count * 
sizeof(*current_package_keywords));
        }
-       atom_implode(atom);
 
        numebld++;
 
@@ -617,25 +594,17 @@ qkeyword_results_cb(tree_pkg_ctx *pkg_ctx, void *priv)
        struct elist *emailw;
        int ret;
 
-       snprintf(buf, sizeof(buf), "%s/%s",
-                       pkg_ctx->cat_ctx->name, pkg_ctx->name);
-       patom = atom_explode(buf);
+       patom = tree_get_atom(pkg_ctx, false);
        if (patom == NULL)
                return EXIT_FAILURE;
 
        if (data->qatom != NULL &&
                        atom_compare(patom, data->qatom) != EQUAL)
-       {
-               atom_implode(patom);
                return EXIT_FAILURE;
-       }
 
        if (data->lastatom != NULL &&
                        atom_compare(data->lastatom, patom) != NOT_EQUAL)
-       {
-               atom_implode(patom);
                return EXIT_SUCCESS;
-       }
 
        if (data->qmaint != NULL) {
                metadata = tree_pkg_metadata(pkg_ctx);
@@ -657,16 +626,13 @@ qkeyword_results_cb(tree_pkg_ctx *pkg_ctx, void *priv)
 
        keywords = data->keywordsbuf;
        meta = tree_pkg_read(pkg_ctx);
-       if (meta == NULL) {
-               atom_implode(patom);
+       if (meta == NULL)
                return EXIT_FAILURE;
-       }
 
        if (read_keywords(meta->KEYWORDS, keywords) < 0) {
                if (verbose)
                        warn("Failed to read keywords for %s%s/%s%s%s",
                                BOLD, pkg_ctx->cat_ctx->name, BLUE, 
pkg_ctx->name, NORM);
-               atom_implode(patom);
                return EXIT_FAILURE;
        }
 
@@ -678,9 +644,7 @@ qkeyword_results_cb(tree_pkg_ctx *pkg_ctx, void *priv)
                patom->PVR = patom->PN;
                patom->PR_int = 0;
                data->lastatom = patom;
-               patom = NULL;
-       } else {
-               atom_implode(patom);
+               pkg_ctx->atom = NULL;  /* take tree's atom */
        }
 
        return EXIT_SUCCESS;
@@ -759,8 +723,7 @@ qkeyword_traverse(tree_pkg_cb func, void *priv)
        array_for_each(overlays, n, overlay) {
                tree_ctx *t = tree_open(portroot, overlay);
                if (t != NULL) {
-                       ret |= tree_foreach_pkg(t, qkeyword_results_cb, priv,
-                                       NULL, true, NULL, qkeyword_vercmp);
+                       ret |= tree_foreach_pkg_sorted(t, qkeyword_results_cb, 
priv);
                        tree_close(t);
                }
        }

Reply via email to