diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2020-04-27 07:58:33 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2020-10-12 16:20:42 +0900 |
| commit | d2cab16301ecabbe67886051d4c777a73de6d327 (patch) | |
| tree | e5d5f6e915cc967f8f178a03b1c51f13dc6c39d2 /src/symbol.c | |
| parent | eddd3249793b3b307da2fe7734d5923cd238a35b (diff) | |
| download | mruby-d2cab16301ecabbe67886051d4c777a73de6d327.tar.gz mruby-d2cab16301ecabbe67886051d4c777a73de6d327.zip | |
Update `presym_find` to use more efficient binary search.
Diffstat (limited to 'src/symbol.c')
| -rw-r--r-- | src/symbol.c | 21 |
1 files changed, 14 insertions, 7 deletions
diff --git a/src/symbol.c b/src/symbol.c index a09298b23..8a98e9e2e 100644 --- a/src/symbol.c +++ b/src/symbol.c @@ -26,13 +26,20 @@ static const char *presym_table[] = { static mrb_sym presym_find(const char *name) { - /* use linear search for now */ - /* binary search should work better */ - int i; - - for (i=0; presym_table[i]; i++) { - if (strcmp(presym_table[i], name)==0) - return i+1; + int start = 0; + int end = MRB_PRESYM_MAX-1; + + while (start<=end) { + int mid = (start+end)/2; + int cmp = strcmp(name, presym_table[mid]); + + if (cmp == 0) { + return mid+1; + } else if (cmp < 0) { + end = mid-1; + } else { + start = mid+1; + } } return 0; } |
