More completely fixed the 0-key thing.

Unfortunately this degrades hash table lookup performance by
about 8%, which affects the streaming benchmark for googlemessage1
by about 5%.  We could get this back at the cost of some memory,
but it would be nice to avoid that.
pull/13171/head
Joshua Haberman 14 years ago
parent 6117730c85
commit 4f9aeee6c7
  1. 9
      Makefile
  2. 6
      src/upb_def.c
  3. 1
      src/upb_table.c
  4. 3
      src/upb_table.h
  5. 1
      src/upbc.c

@ -40,7 +40,7 @@ LDLIBS=-lpthread src/libupb.a
# of the scheme we use that compiles the same source file multiple times with
# different -D options, which can include different header files.
deps: gen-deps.sh Makefile $(CORE) $(STREAM)
@CPPFLAGS="$(CPPFLAGS)" ./gen-deps.sh $(CORE) $(STREAM)
@CPPFLAGS="$(CPPFLAGS)" ./gen-deps.sh $(CORE) $(STREAM) $(TOOLS)
@echo Regenerating dependencies for src/...
$(ALLSRC): perf-cppflags
@ -68,6 +68,9 @@ STREAM= \
src/upb_msg.c \
src/upb_glue.c \
TOOLS= \
src/upbc.c
# Parts of core that are yet to be converted.
OTHERSRC=src/upb_encoder.c src/upb_text.c
@ -222,13 +225,13 @@ tests/t.test_vs_proto2.googlemessage2: \
tests/test_table: tests/test_table.cc
@# Includes <hash_set> which is a deprecated header.
@echo CXX $<
$(CXX) $(CXXFLAGS) $(CPPFLAGS) -Wno-deprecated -o $@ $< $(LIBUPB)
@$(CXX) $(CXXFLAGS) $(CPPFLAGS) -Wno-deprecated -o $@ $< $(LIBUPB)
tests/tests: src/libupb.a
# Tools
tools: src/upbc
tools/upbc: $(LIBUPB)
src/upbc: $(LIBUPB)
# Benchmarks. ##################################################################

@ -476,12 +476,6 @@ static upb_flow_t upb_enumdef_EnumValueDescriptorProto_value(void *_b,
break;
case GOOGLE_PROTOBUF_ENUMVALUEDESCRIPTORPROTO_NUMBER_FIELDNUM:
b->number = upb_value_getint32(val);
if (b->number == 0) {
upb_seterr(&b->status, UPB_ERROR,
"Enums with a value of 0 are currently broken; see "
"http://code.google.com/p/upb/issues/detail?id=1.");
return UPB_BREAK;
}
b->saw_number = true;
break;
default:

@ -129,7 +129,6 @@ static void intinsert(upb_inttable *t, upb_inttable_entry *e)
void upb_inttable_insert(upb_inttable *t, upb_inttable_entry *e)
{
assert(e->key != 0);
if((double)(t->t.count + 1) / upb_inttable_size(t) > MAX_LOAD) {
/* Need to resize. New table of double the size, add old elements to it. */
upb_inttable new_table;

@ -100,12 +100,11 @@ INLINE uint32_t upb_inttable_bucket(upb_inttable *t, upb_inttable_key_t k) {
* ability to optimize. */
INLINE void *upb_inttable_fastlookup(upb_inttable *t, uint32_t key,
uint32_t entry_size) {
assert(key != 0);
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) return e;
if(e->key == key && e->has_entry) return e;
} while((bucket = e->next) != UPB_END_OF_CHAIN);
return NULL; /* Not found. */
}

@ -231,6 +231,7 @@ int main(int argc, char *argv[])
free(defs);
upb_string_unref(descriptor);
upb_symtab_unref(s);
upb_symtab_unref(s2);
fclose(h_const_file);
return 0;

Loading…
Cancel
Save