From: Michael Schroeder Date: Wed, 7 May 2008 17:00:21 +0000 (+0000) Subject: - speed up array creation a bit by caching last values X-Git-Tag: BASE-SuSE-Code-12_1-Branch~308^2~368 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=062b4c0baac08a1ed7454be56f2bbee5f9bf3137;p=thirdparty%2Flibsolv.git - speed up array creation a bit by caching last values --- diff --git a/src/repodata.c b/src/repodata.c index 910bfe84..387a16a0 100644 --- a/src/repodata.c +++ b/src/repodata.c @@ -1405,6 +1405,14 @@ repodata_add_array(Repodata *data, Id handle, Id keyname, Id keytype, int entrys int oldsize; Id *ida, *pp; + if (handle == data->lasthandle && data->keys[data->lastkey].name == keyname && data->keys[data->lastkey].type == keytype && data->attriddatalen == data->lastdatalen) + { + /* great! just append the new data */ + data->attriddata = sat_extend(data->attriddata, data->attriddatalen, entrysize, sizeof(Id), REPODATA_ATTRIDDATA_BLOCK); + data->attriddatalen--; /* overwrite terminating 0 */ + data->lastdatalen += entrysize; + return; + } pp = data->structs[handle]; if (pp) for (; *pp; pp += 2) @@ -1420,6 +1428,7 @@ repodata_add_array(Repodata *data, Id handle, Id keyname, Id keytype, int entrys key.storage = KEY_STORAGE_INCORE; data->attriddata = sat_extend(data->attriddata, data->attriddatalen, entrysize + 1, sizeof(Id), REPODATA_ATTRIDDATA_BLOCK); repodata_set(data, handle, &key, data->attriddatalen); + data->lasthandle = 0; /* next time... */ return; } oldsize = 0; @@ -1439,6 +1448,9 @@ repodata_add_array(Repodata *data, Id handle, Id keyname, Id keytype, int entrys pp[1] = data->attriddatalen; data->attriddatalen += oldsize; } + data->lasthandle = handle; + data->lastkey = *pp; + data->lastdatalen = data->attriddatalen + entrysize + 1; } static inline int @@ -1998,6 +2010,9 @@ fprintf(stderr, "schemadata %p\n", data->schemadata); if (data->structs[entry]) sat_free(data->structs[entry]); data->structs = sat_free(data->structs); + data->lasthandle = 0; + data->lastkey = 0; + data->lastdatalen = 0; sat_free(schema); sat_free(seen); diff --git a/src/repodata.h b/src/repodata.h index abf611f4..ca9bbe10 100644 --- a/src/repodata.h +++ b/src/repodata.h @@ -111,6 +111,11 @@ typedef struct _Repodata { Id **structs; /* key-value lists */ unsigned int nstructs; + /* array cache */ + Id lasthandle; + Id lastkey; + Id lastdatalen; + Id *addedfileprovides; } Repodata;