summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoshua Haberman <joshua@reverberate.org>2011-02-14 16:44:56 -0800
committerJoshua Haberman <joshua@reverberate.org>2011-02-14 16:44:56 -0800
commita80bcc50853500f3213a9a24c0752057e3c49b7c (patch)
tree743ad5880fa9a836fc24e06107889c5f98ea7716
parent5137ac8d611def74ae493fc5cae989d510bca7ad (diff)
Recover bad performance of 0-keyed tables.
We do this by special-casing the (unusual) zero case and only bother checking the is_empty bit in the zero case.
-rw-r--r--src/upb_table.h21
1 files changed, 15 insertions, 6 deletions
diff --git a/src/upb_table.h b/src/upb_table.h
index e667f0d..b173101 100644
--- a/src/upb_table.h
+++ b/src/upb_table.h
@@ -101,12 +101,21 @@ INLINE uint32_t upb_inttable_bucket(upb_inttable *t, upb_inttable_key_t k) {
INLINE void *upb_inttable_fastlookup(upb_inttable *t, uint32_t key,
uint32_t entry_size) {
uint32_t bucket = upb_inttable_bucket(t, key);
- upb_inttable_entry *e;
- do {
- e = (upb_inttable_entry*)UPB_INDEX(t->t.entries, bucket-1, entry_size);
- if(e->key == key && e->has_entry) return e;
- } while((bucket = e->next) != UPB_END_OF_CHAIN);
- return NULL; /* Not found. */
+ upb_inttable_entry *e =
+ (upb_inttable_entry*)UPB_INDEX(t->t.entries, bucket-1, entry_size);
+ if (key == 0) {
+ while (1) {
+ if (e->key == 0 && e->has_entry) return e;
+ if ((bucket = e->next) == UPB_END_OF_CHAIN) return NULL;
+ e = (upb_inttable_entry*)UPB_INDEX(t->t.entries, bucket-1, entry_size);
+ }
+ } else {
+ while (1) {
+ if (e->key == key) return e;
+ if ((bucket = e->next) == UPB_END_OF_CHAIN) return NULL;
+ e = (upb_inttable_entry*)UPB_INDEX(t->t.entries, bucket-1, entry_size);
+ }
+ }
}
INLINE void *upb_inttable_lookup(upb_inttable *t, uint32_t key) {
generated by cgit on debian on lair
contact matthew@masot.net with questions or feedback