mirror of
https://gitee.com/Lyon1998/pikapython.git
synced 2025-01-29 17:22:56 +08:00
add simple cache algorithm to the hash list
This commit is contained in:
parent
0278a9d3fb
commit
123162314c
@ -28,6 +28,7 @@
|
|||||||
#ifndef _arg__H
|
#ifndef _arg__H
|
||||||
#define _arg__H
|
#define _arg__H
|
||||||
#include "dataMemory.h"
|
#include "dataMemory.h"
|
||||||
|
#include "dataLink.h"
|
||||||
|
|
||||||
typedef uint8_t Arg;
|
typedef uint8_t Arg;
|
||||||
typedef uint32_t Hash;
|
typedef uint32_t Hash;
|
||||||
@ -46,7 +47,10 @@ typedef enum {
|
|||||||
typedef struct __arg __arg;
|
typedef struct __arg __arg;
|
||||||
|
|
||||||
struct __arg {
|
struct __arg {
|
||||||
__arg *next;
|
union {
|
||||||
|
__arg *next;
|
||||||
|
Link link;
|
||||||
|
};
|
||||||
uint16_t size;
|
uint16_t size;
|
||||||
uint8_t type;
|
uint8_t type;
|
||||||
uint8_t : 8;
|
uint8_t : 8;
|
||||||
|
@ -244,8 +244,17 @@ int32_t args_setArg(Args* self, Arg* arg) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef __PIKA_CFG_HASH_LIST_CACHE_SIZE
|
||||||
|
#define __PIKA_CFG_HASH_LIST_CACHE_SIZE 4
|
||||||
|
#endif
|
||||||
|
|
||||||
LinkNode* args_getNode_hash(Args* self, Hash nameHash) {
|
LinkNode* args_getNode_hash(Args* self, Hash nameHash) {
|
||||||
|
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
|
||||||
|
/* normal list search without cache */
|
||||||
LinkNode* nodeNow = self->firstNode;
|
LinkNode* nodeNow = self->firstNode;
|
||||||
|
|
||||||
while (NULL != nodeNow) {
|
while (NULL != nodeNow) {
|
||||||
@ -257,6 +266,38 @@ LinkNode* args_getNode_hash(Args* self, Hash nameHash) {
|
|||||||
|
|
||||||
nodeNow = content_getNext(nodeNow);
|
nodeNow = content_getNext(nodeNow);
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
|
||||||
|
LinkNode ** ppnode = (LinkNode **)&(self->firstNode);
|
||||||
|
int_fast8_t n = 0;
|
||||||
|
|
||||||
|
while (NULL != (*ppnode)) {
|
||||||
|
Arg* arg = (*ppnode);
|
||||||
|
Hash thisNameHash = arg_getNameHash(arg);
|
||||||
|
if (thisNameHash == nameHash) {
|
||||||
|
|
||||||
|
__arg *tmp = (__arg *)(*ppnode);
|
||||||
|
if (n > __PIKA_CFG_HASH_LIST_CACHE_SIZE) {
|
||||||
|
|
||||||
|
/* the first __PIKA_CFG_HASH_LIST_CACHE_SIZE items in the list
|
||||||
|
* is considered as a cache.
|
||||||
|
* Don't make __PIKA_CFG_HASH_LIST_CACHE_SIZE too big, otherwise
|
||||||
|
* this optimisation is useless.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*! remove current node from the list */
|
||||||
|
(*ppnode) = (LinkNode *)(tmp->next);
|
||||||
|
|
||||||
|
/*! move the node to the cache */
|
||||||
|
tmp->next = (__arg *)(self->firstNode);
|
||||||
|
self->firstNode = (LinkNode *)tmp;
|
||||||
|
}
|
||||||
|
return (LinkNode *)tmp;
|
||||||
|
}
|
||||||
|
n++;
|
||||||
|
ppnode = (LinkNode **)&(((__arg *)(*ppnode))->next);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user