diff options
author | Kuan-Wei Chiu <visitorckw@gmail.com> | 2024-09-10 00:23:27 +0800 |
---|---|---|
committer | DJ Delorie <dj@redhat.com> | 2024-12-11 17:04:42 -0500 |
commit | 950891b5e7a5307272da3e632832ac9da4c9eeec (patch) | |
tree | 662ca8083bce3ecc18c526b8e2c4e545bc485240 /bits | |
parent | dce846c789b68a86721d7bfc6f18c728c8c6d3bf (diff) | |
download | glibc-950891b5e7a5307272da3e632832ac9da4c9eeec.zip glibc-950891b5e7a5307272da3e632832ac9da4c9eeec.tar.gz glibc-950891b5e7a5307272da3e632832ac9da4c9eeec.tar.bz2 |
Optimize bsearch() implementation for performance
Optimize the bsearch() function to improve binary search performance.
Although the code size grew by 8 bytes, the new implementation achieves
a 15% reduction in execution time on my x86 machine, according to the
bench-bsearch benchmark results.
Signed-off-by: Kuan-Wei Chiu <visitorckw@gmail.com>
Reviewed-by: Noah Goldstein <goldstein.w.n@gmail.com>
Reviewed-by: DJ Delorie <dj@redhat.com>
Diffstat (limited to 'bits')
-rw-r--r-- | bits/stdlib-bsearch.h | 20 |
1 files changed, 9 insertions, 11 deletions
diff --git a/bits/stdlib-bsearch.h b/bits/stdlib-bsearch.h index 540d718..57f060b 100644 --- a/bits/stdlib-bsearch.h +++ b/bits/stdlib-bsearch.h @@ -20,22 +20,14 @@ __extern_inline void * bsearch (const void *__key, const void *__base, size_t __nmemb, size_t __size, __compar_fn_t __compar) { - size_t __l, __u, __idx; const void *__p; int __comparison; - __l = 0; - __u = __nmemb; - while (__l < __u) + while (__nmemb) { - __idx = (__l + __u) / 2; - __p = (const void *) (((const char *) __base) + (__idx * __size)); + __p = (const void *) (((const char *) __base) + ((__nmemb >> 1) * __size)); __comparison = (*__compar) (__key, __p); - if (__comparison < 0) - __u = __idx; - else if (__comparison > 0) - __l = __idx + 1; - else + if (__comparison == 0) { #if __GNUC_PREREQ(4, 6) # pragma GCC diagnostic push @@ -46,6 +38,12 @@ bsearch (const void *__key, const void *__base, size_t __nmemb, size_t __size, # pragma GCC diagnostic pop #endif } + if (__comparison > 0) + { + __base = ((const char *) __p) + __size; + --__nmemb; + } + __nmemb >>= 1; } return NULL; |