From c1705c6a54c56267a6c7ccd65433eec86624928a Mon Sep 17 00:00:00 2001 From: paladin-t Date: Tue, 26 Jan 2016 11:05:55 +0800 Subject: [PATCH] *optimized cached list accessing. --- HISTORY | 1 + core/my_basic.c | 59 ++++++++++++++++++++++++++++++++++---------- output/my_basic.exe | Bin 356864 -> 357376 bytes 3 files changed, 47 insertions(+), 13 deletions(-) diff --git a/HISTORY b/HISTORY index dc56f50..5a2a501 100755 --- a/HISTORY +++ b/HISTORY @@ -1,5 +1,6 @@ Jan. 26 2016 Added source file information to stepped handler +Optimized cached list accessing Jan. 25 2016 Fixed a memory leak when printing a referenced usertype diff --git a/core/my_basic.c b/core/my_basic.c index e10edfd..a2b054e 100755 --- a/core/my_basic.c +++ b/core/my_basic.c @@ -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 */ _ls_node_t* result = 0; _ls_node_t* tmp = 0; - int idx = index; + int n = 0; mb_assert(coll); _fill_ranged(coll); - /* TODO: Optimize me */ if(index >= 0 && index < (int)coll->count) { - if(coll->cached_node && !(index < coll->cached_index / 2)) { - 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--; + /* HEAD ... LEFT ... PIVOT ... RIGHT ... TAIL */ + int head = 0, + left = coll->cached_index / 2, + right = coll->cached_index + (coll->count - coll->cached_index) / 2, + tail = coll->count - 1; + if(coll->cached_node) { + if(index >= head && index < left) { /* [HEAD, LEFT) */ + 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 { + n = index; tmp = coll->list->next; - while(tmp && idx) { + while(tmp && n) { tmp = tmp->next; - --idx; + --n; } if(tmp) { result = tmp; diff --git a/output/my_basic.exe b/output/my_basic.exe index c619591a45d7559fb8b1cdf0b28668f1787ffddb..7418fab1165e295a4bab4ffd033d125452bf7c0a 100755 GIT binary patch delta 15096 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 A)c^nh