From 0f2f7f7b6299c3642aeafb3d5452220bcfa831e6 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Mon, 19 Jan 2004 10:01:43 +0000 Subject: [PATCH] Mit einem Hashtable nrt_find beschleunigt. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ausführungszeit ist durch die beiden letzten Änderungen von 26:44 minuten auf 15:25 minuten gesunken, was schon ein echt spürbarer Fortschritt ist. Weitere Optimierungskandidaten: 19.80 116.74 116.74 8791 13.28 17.58 firstregion 11.56 184.90 68.16 7275 9.37 16.38 lastregion 7.28 227.80 42.90 644401018 0.00 0.00 a_find 6.81 267.97 40.17 856647 0.05 0.07 internal_path_find 4.57 294.90 26.93 1055956 0.03 0.03 mt_find 3.33 314.51 19.61 263723185 0.00 0.00 check_leuchtturm --- src/common/util/nrmessage.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/common/util/nrmessage.c b/src/common/util/nrmessage.c index cb4e75b89..9ff860249 100644 --- a/src/common/util/nrmessage.c +++ b/src/common/util/nrmessage.c @@ -20,17 +20,15 @@ #include "message.h" #include "language.h" #include "translation.h" +#include "goodies.h" /* libc includes */ #include #include #include -static nrmessage_type * messagetypes; - -nrmessage_type * get_nrmessagetypes(void) { - return messagetypes; -} +#define NRT_MAXHASH 256 +static nrmessage_type * messagetypes[NRT_MAXHASH]; const char * nrt_string(const struct nrmessage_type *type) @@ -42,7 +40,8 @@ nrmessage_type * nrt_find(const struct locale * lang, const struct message_type * mtype) { nrmessage_type * found = NULL; - nrmessage_type * type = messagetypes; + unsigned int hash = hashstring(mtype->name) % NRT_MAXHASH; + nrmessage_type * type = messagetypes[hash]; while (type) { if (type->mtype==mtype) { if (found==NULL) found = type; @@ -60,7 +59,8 @@ nrt_find(const struct locale * lang, const struct message_type * mtype) void nrt_register(const struct message_type * mtype, const struct locale * lang, const char * string, int level, const char * section) { - nrmessage_type * nrt = messagetypes; + unsigned int hash = hashstring(mtype->name) % NRT_MAXHASH; + nrmessage_type * nrt = messagetypes[hash]; while (nrt && (nrt->lang!=lang || nrt->mtype!=mtype)) { nrt = nrt->next; } @@ -71,11 +71,11 @@ nrt_register(const struct message_type * mtype, const struct locale * lang, cons nrt = malloc(sizeof(nrmessage_type)); nrt->lang = lang; nrt->mtype = mtype; - nrt->next = messagetypes; + nrt->next = messagetypes[hash]; nrt->level=level; if (section) nrt->section = strdup(section); else nrt->section = NULL; - messagetypes = nrt; + messagetypes[hash] = nrt; assert(string && *string); nrt->string = strdup(string); *c = '\0';