As we know, binary search is much faster than sequential search, we can use binary search to make hval_to_sheep() faster. Signed-off-by: levin li <xingke.lwp at taobao.com> --- Patch update: use get_vnode_pos to replace the bsearch_in_entries include/sheep.h | 44 ++++++++++++++++++++++++++++---------------- 1 file changed, 28 insertions(+), 16 deletions(-) diff --git a/include/sheep.h b/include/sheep.h index 4fd05f7..f5cecbc 100644 --- a/include/sheep.h +++ b/include/sheep.h @@ -225,18 +225,35 @@ next: return idx; } +static inline int get_vnode_pos(struct sd_vnode *entries, + int nr_entries, uint64_t id) +{ + int start, end, pos; + + start = 0; + end = nr_entries - 1; + + if (id > entries[end].id) + return end; +again: + pos = (end - start) / 2 + start; + if (entries[pos].id < id) { + if (entries[pos + 1].id >= id) + return pos; + start = pos; + } else + end = pos; + goto again; + + return pos; +} + static inline int hval_to_sheep(struct sd_vnode *entries, int nr_entries, uint64_t id, int idx) { - int i; - struct sd_vnode *e = entries, *n; + int pos = get_vnode_pos(entries, nr_entries, id); - for (i = 0; i < nr_entries - 1; i++, e++) { - n = e + 1; - if (id > e->id && id <= n->id) - break; - } - return get_nth_node(entries, nr_entries, (i + 1) % nr_entries, idx); + return get_nth_node(entries, nr_entries, (pos + 1) % nr_entries, idx); } static inline int obj_to_sheep(struct sd_vnode *entries, @@ -250,17 +267,12 @@ static inline int obj_to_sheep(struct sd_vnode *entries, static inline void hval_to_sheeps(struct sd_vnode *entries, int nr_entries, uint64_t id, int nr_copies, int *idxs) { - int i, idx; - struct sd_vnode *e = entries, *n; + int idx; + int pos = get_vnode_pos(entries, nr_entries, id); - for (i = 0; i < nr_entries - 1; i++, e++) { - n = e + 1; - if (id > e->id && id <= n->id) - break; - } for (idx = 0; idx < nr_copies; idx++) idxs[idx] = get_nth_node(entries, nr_entries, - (i + 1) % nr_entries, idx); + (pos + 1) % nr_entries, idx); } static inline void obj_to_sheeps(struct sd_vnode *entries, -- 1.7.10 |