diff options
author | Joshua Haberman <jhaberman@gmail.com> | 2013-05-11 18:48:23 -0700 |
---|---|---|
committer | Joshua Haberman <jhaberman@gmail.com> | 2013-05-11 18:48:23 -0700 |
commit | 622481990b17bed5e6fd69a1cab5d5f20413be79 (patch) | |
tree | 66c06c24d09d8a8c70895c07eabd26ddedb78f5e | |
parent | 70293f5faabe08fc9bdef26ad0b1d6afe19e8f79 (diff) |
Updated benchmarks to new APIs.
-rw-r--r-- | Makefile | 4 | ||||
-rw-r--r-- | benchmarks/parsestream.upb.c | 75 | ||||
-rw-r--r-- | benchmarks/parsetoproto2.upb.cc | 48 |
3 files changed, 61 insertions, 66 deletions
@@ -51,7 +51,7 @@ CXXFLAGS=-Ibindings/cpp INCLUDE=-Itests -I. CPPFLAGS=$(INCLUDE) -Wall -Wextra -Wno-sign-compare $(USER_CFLAGS) LDLIBS=-lpthread upb/libupb.a -LUA=lua5.1 # 5.1 and 5.2 should both be supported +LUA=lua # 5.1 and 5.2 should both be supported # Build with "make Q=" to see all commands that are being executed. Q=@ @@ -173,7 +173,7 @@ upb/def.lo: upb/def.c upb/pb/decoder_x64.h: upb/pb/decoder_x64.dasc $(E) DYNASM $< - $(Q) $(LUA) dynasm/dynasm.lua upb/pb/decoder_x64.dasc > upb/pb/decoder_x64.h + $(Q) $(LUA) dynasm/dynasm.lua upb/pb/decoder_x64.dasc > upb/pb/decoder_x64.h || (rm upb/pb/decoder_x64.h ; false) ifneq ($(shell uname), Darwin) upb/pb/jit_debug_elf_file.o: upb/pb/jit_debug_elf_file.s diff --git a/benchmarks/parsestream.upb.c b/benchmarks/parsestream.upb.c index b5a353c..0d709a4 100644 --- a/benchmarks/parsestream.upb.c +++ b/benchmarks/parsestream.upb.c @@ -10,33 +10,31 @@ static char *input_str; static size_t input_len; static const upb_msgdef *def; -static upb_decoder decoder; -static upb_stringsrc stringsrc; -static upb_decoderplan *plan; +upb_pipeline pipeline; +static upb_sink *sink; -static upb_sflow_t startsubmsg(void *_m, upb_value fval) { - (void)_m; - (void)fval; - return UPB_CONTINUE_WITH(NULL); +static void *startsubmsg(const upb_sinkframe *frame) { + UPB_UNUSED(frame); + return input_str; } -static upb_flow_t value(void *closure, upb_value fval, upb_value val) { - (void)closure; - (void)fval; - (void)val; - return UPB_CONTINUE; -} - -void onfreg(void *c, upb_fhandlers *fh, const upb_fielddef *f) { - upb_fhandlers_setvalue(fh, &value); - upb_fhandlers_setstartsubmsg(fh, &startsubmsg); +void onmreg(void *c, upb_handlers *h) { + upb_msg_iter i; + upb_msg_begin(&i, upb_handlers_msgdef(h)); + for(; !upb_msg_done(&i); upb_msg_next(&i)) { + const upb_fielddef *f = upb_msg_iter_field(&i); + if (upb_fielddef_type(f) == UPB_TYPE_MESSAGE) { + upb_handlers_setstartsubmsg(h, f, startsubmsg, NULL, NULL); + } + } + UPB_UNUSED(c); } static bool initialize() { // Initialize upb state, decode descriptor. upb_status status = UPB_STATUS_INIT; - upb_symtab *s = upb_symtab_new(); + upb_symtab *s = upb_symtab_new(&s); upb_load_descriptor_file_into_symtab(s, MESSAGE_DESCRIPTOR_FILE, &status); if(!upb_ok(&status)) { fprintf(stderr, "Error reading descriptor: %s\n", @@ -44,12 +42,12 @@ static bool initialize() return false; } - def = upb_dyncast_msgdef_const(upb_symtab_lookup(s, MESSAGE_NAME, &def)); + def = upb_dyncast_msgdef(upb_symtab_lookup(s, MESSAGE_NAME, &def)); if(!def) { fprintf(stderr, "Error finding symbol '%s'.\n", MESSAGE_NAME); return false; } - upb_symtab_unref(s); + upb_symtab_unref(s, &s); // Read the message data itself. input_str = upb_readfile(MESSAGE_FILE, &input_len); @@ -58,36 +56,37 @@ static bool initialize() return false; } - upb_handlers *handlers = upb_handlers_new(); // Cause all messages to be read, but do nothing when they are. - upb_handlers_regmsgdef(handlers, def, NULL, &upb_onfreg_hset, NULL); - upb_decoder_init(&decoder); - plan = upb_decoderplan_new(handlers, JIT); - upb_decoder_resetplan(&decoder, plan, 0); - upb_handlers_unref(handlers); - upb_stringsrc_init(&stringsrc); + const upb_handlers* handlers = + upb_handlers_newfrozen(def, NULL, &handlers, &onmreg, NULL); + const upb_handlers* decoder_handlers = + upb_pbdecoder_gethandlers(handlers, JIT, &decoder_handlers); + upb_msgdef_unref(def, &def); + + upb_pipeline_init(&pipeline, NULL, 0, upb_realloc, NULL); + upb_sink *s2 = upb_pipeline_newsink(&pipeline, handlers); + sink = upb_pipeline_newsink(&pipeline, decoder_handlers); + upb_pipeline_donateref(&pipeline, decoder_handlers, &decoder_handlers); + upb_pipeline_donateref(&pipeline, handlers, &handlers); + upb_pbdecoder *decoder = upb_sinkframe_userdata(upb_sink_top(sink)); + upb_pbdecoder_resetsink(decoder, s2); return true; } static void cleanup() { free(input_str); - upb_def_unref(UPB_UPCAST(def), &def); - upb_decoder_uninit(&decoder); - upb_decoderplan_unref(plan); - upb_stringsrc_uninit(&stringsrc); + upb_pipeline_uninit(&pipeline); } static size_t run(int i) { (void)i; - upb_status status = UPB_STATUS_INIT; - upb_stringsrc_reset(&stringsrc, input_str, input_len); - upb_decoder_resetinput(&decoder, upb_stringsrc_allbytes(&stringsrc), NULL); - if (upb_decoder_decode(&decoder) != UPB_OK) goto err; + upb_pipeline_reset(&pipeline); + if (!upb_bytestream_putstr(sink, input_str, input_len)) { + fprintf(stderr, "Decode error: %s", upb_status_getstr(upb_pipeline_status(&pipeline))); + return 0; + } return input_len; -err: - fprintf(stderr, "Decode error: %s", upb_status_getstr(&status)); - return 0; } diff --git a/benchmarks/parsetoproto2.upb.cc b/benchmarks/parsetoproto2.upb.cc index 5023b0e..4ad1faa 100644 --- a/benchmarks/parsetoproto2.upb.cc +++ b/benchmarks/parsetoproto2.upb.cc @@ -4,22 +4,19 @@ #include "main.c" #include <stdint.h> -#include "upb/bytestream.hpp" -#include "upb/def.hpp" -#include "upb/msg.hpp" -#include "upb/pb/decoder.hpp" +#include "upb/bytestream.h" +#include "upb/def.h" +#include "upb/pb/decoder.h" #include "upb/pb/glue.h" -#include "upb/proto2_bridge.hpp" +#include "upb/google/bridge.h" #include MESSAGE_HFILE const char *str; size_t len; MESSAGE_CIDENT msg[NUM_MESSAGES]; -MESSAGE_CIDENT msg2; -upb::StringSource strsrc; -upb::Decoder d; -const upb::MessageDef *def; -upb::DecoderPlan* plan; +upb::SeededPipeline<8192> pipeline(upb_realloc, NULL); +upb::Sink *decoder_sink; +upb::Sink *proto2_sink; static bool initialize() { @@ -30,32 +27,31 @@ static bool initialize() return false; } - def = upb::proto2_bridge::NewFinalMessageDef(msg2, &def); + const upb::Handlers* h = upb::google::NewWriteHandlers(MESSAGE_CIDENT(), &h); + const upb::Handlers* h2 = upb::pb::GetDecoderHandlers(h, JIT, &h2); - msg2.ParseFromArray(str, len); + proto2_sink = pipeline.NewSink(h); + decoder_sink = pipeline.NewSink(h2); + pipeline.DonateRef(h, &h); + pipeline.DonateRef(h2, &h2); - upb::Handlers* h = upb::Handlers::New(); - upb::RegisterWriteHandlers(h, def); - plan = upb::DecoderPlan::New(h, JIT); - d.ResetPlan(plan, 0); - h->Unref(); + upb::pb::Decoder* d = decoder_sink->top()->GetUserdata<upb::pb::Decoder>(); + upb::pb::ResetDecoderSink(d, proto2_sink); return true; } static void cleanup() { - def->Unref(&def); - plan->Unref(); } static size_t run(int i) { + pipeline.Reset(); + proto2_sink->Reset(&msg[i % NUM_MESSAGES]); msg[i % NUM_MESSAGES].Clear(); - strsrc.Reset(str, len); - d.ResetInput(strsrc.AllBytes(), &msg[i % NUM_MESSAGES]); - if (d.Decode() != UPB_OK) goto err; - return len; -err: - fprintf(stderr, "Decode error: %s", d.status().GetString()); - return 0; + if (!upb::PutStringToBytestream(decoder_sink, str, len)) { + fprintf(stderr, "Decode error: %s", pipeline.status().GetString()); + return 0; + } + return len; } |