From: Michael Schroeder Date: Wed, 8 Nov 2023 12:53:11 +0000 (+0100) Subject: repo_write: add a small cache for putinowndirpool() X-Git-Tag: 0.7.27~7 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=23cbed3219bd07b5c3fa1ed8a6f2fa6c478c0fdb;p=thirdparty%2Flibsolv.git repo_write: add a small cache for putinowndirpool() This helps a lot with diskusage data or filelists. --- diff --git a/src/repo_write.c b/src/repo_write.c index 73755b45..c5e38dec 100644 --- a/src/repo_write.c +++ b/src/repo_write.c @@ -300,6 +300,8 @@ struct cbdata { Id lastdirid; /* last dir id seen in this repodata */ Id lastdirid_own; /* last dir id put in own pool */ + + Id diridcache[3 * 256]; }; #define NEEDID_BLOCK 1023 @@ -578,10 +580,17 @@ putinowndirpool_slow(struct cbdata *cbdata, Repodata *data, Dirpool *dp, Id dir) static inline Id putinowndirpool(struct cbdata *cbdata, Repodata *data, Id dir) { + Id *cacheent; if (dir && dir == cbdata->lastdirid) return cbdata->lastdirid_own; + cacheent = cbdata->diridcache + (dir & 255); + if (dir && cacheent[0] == dir && cacheent[256] == data->repodataid) + return cacheent[512]; cbdata->lastdirid = dir; cbdata->lastdirid_own = putinowndirpool_slow(cbdata, data, &data->dirpool, dir); + cacheent[0] = dir; + cacheent[256] = data->repodataid; + cacheent[512] = cbdata->lastdirid_own; return cbdata->lastdirid_own; }