*optimized cached list accessing.

This commit is contained in:
paladin-t 2016-01-26 11:05:55 +08:00
parent 9ad0a75148
commit c1705c6a54
3 changed files with 47 additions and 13 deletions

View File

@ -1,5 +1,6 @@
Jan. 26 2016 Jan. 26 2016
Added source file information to stepped handler Added source file information to stepped handler
Optimized cached list accessing
Jan. 25 2016 Jan. 25 2016
Fixed a memory leak when printing a referenced usertype Fixed a memory leak when printing a referenced usertype

View File

@ -6093,30 +6093,63 @@ _ls_node_t* _node_at_list(_list_t* coll, int index) {
/* Get a node in a list with a specific index */ /* Get a node in a list with a specific index */
_ls_node_t* result = 0; _ls_node_t* result = 0;
_ls_node_t* tmp = 0; _ls_node_t* tmp = 0;
int idx = index; int n = 0;
mb_assert(coll); mb_assert(coll);
_fill_ranged(coll); _fill_ranged(coll);
/* TODO: Optimize me */
if(index >= 0 && index < (int)coll->count) { if(index >= 0 && index < (int)coll->count) {
if(coll->cached_node && !(index < coll->cached_index / 2)) { /* HEAD ... LEFT ... PIVOT ... RIGHT ... TAIL */
while(index != coll->cached_index) { int head = 0,
if(index > coll->cached_index) { left = coll->cached_index / 2,
coll->cached_node = coll->cached_node->next; right = coll->cached_index + (coll->count - coll->cached_index) / 2,
coll->cached_index++; tail = coll->count - 1;
} else if(index < coll->cached_index) { if(coll->cached_node) {
coll->cached_node = coll->cached_node->prev; if(index >= head && index < left) { /* [HEAD, LEFT) */
coll->cached_index--; n = index;
tmp = coll->list->next;
while(tmp && n) {
tmp = tmp->next;
--n;
} }
if(tmp) {
result = tmp;
coll->cached_node = tmp;
coll->cached_index = index;
}
} else if(index >= left && index <= right) { /* [LEFT, RIGHT] */
while(index != coll->cached_index) {
if(index > coll->cached_index) {
coll->cached_node = coll->cached_node->next;
coll->cached_index++;
} else if(index < coll->cached_index) {
coll->cached_node = coll->cached_node->prev;
coll->cached_index--;
}
}
result = coll->cached_node;
} else if(index > right && index <= tail) { /* (RIGHT, TAIL] */
n = tail - index;
tmp = coll->list->prev;
while(tmp && n) {
tmp = tmp->prev;
--n;
}
if(tmp) {
result = tmp;
coll->cached_node = tmp;
coll->cached_index = index;
}
} else {
mb_assert(0 && "Impossible.");
} }
result = coll->cached_node;
} else { } else {
n = index;
tmp = coll->list->next; tmp = coll->list->next;
while(tmp && idx) { while(tmp && n) {
tmp = tmp->next; tmp = tmp->next;
--idx; --n;
} }
if(tmp) { if(tmp) {
result = tmp; result = tmp;

Binary file not shown.