From fa82e4fbf065bb474b0f87023f66edffb8a5b850 Mon Sep 17 00:00:00 2001 From: Joshua Haberman Date: Wed, 17 Aug 2011 08:15:57 -0700 Subject: Benchmark JIT vs no JIT without forcing a whole-project recompile. --- benchmarks/parsestream.upb.c | 87 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 benchmarks/parsestream.upb.c (limited to 'benchmarks/parsestream.upb.c') diff --git a/benchmarks/parsestream.upb.c b/benchmarks/parsestream.upb.c new file mode 100644 index 0000000..37ccb42 --- /dev/null +++ b/benchmarks/parsestream.upb.c @@ -0,0 +1,87 @@ + +#include "main.c" + +#include +#include "upb/bytestream.h" +#include "upb/def.h" +#include "upb/pb/decoder.h" +#include "upb/pb/glue.h" + +static char *input_str; +static size_t input_len; +static upb_msgdef *def; +static upb_decoder decoder; +static upb_stringsrc stringsrc; + +static upb_sflow_t startsubmsg(void *_m, upb_value fval) { + (void)_m; + (void)fval; + return UPB_CONTINUE_WITH(NULL); +} + +static upb_flow_t value(void *closure, upb_value fval, upb_value val) { + (void)closure; + (void)fval; + (void)val; + return UPB_CONTINUE; +} + +static bool initialize() +{ + // Initialize upb state, decode descriptor. + upb_status status = UPB_STATUS_INIT; + upb_symtab *s = upb_symtab_new(); + upb_read_descriptorfile(s, MESSAGE_DESCRIPTOR_FILE, &status); + if(!upb_ok(&status)) { + upb_status_print(&status, stderr); + return false; + } + + def = upb_dyncast_msgdef(upb_symtab_lookup(s, MESSAGE_NAME)); + if(!def) { + fprintf(stderr, "Error finding symbol '%s'.\n", MESSAGE_NAME); + return false; + } + upb_symtab_unref(s); + + // Read the message data itself. + input_str = upb_readfile(MESSAGE_FILE, &input_len); + if(input_str == NULL) { + fprintf(stderr, "Error reading " MESSAGE_FILE "\n"); + return false; + } + + upb_handlers *handlers = upb_handlers_new(); + if (!JIT) handlers->should_jit = false; + // Cause all messages to be read, but do nothing when they are. + upb_handlerset hset = {NULL, NULL, value, startsubmsg, NULL, NULL, NULL}; + upb_handlers_reghandlerset(handlers, def, &hset); + upb_decoder_initforhandlers(&decoder, handlers); + upb_handlers_unref(handlers); + upb_stringsrc_init(&stringsrc); + return true; +} + +static void cleanup() +{ + free(input_str); + upb_def_unref(UPB_UPCAST(def)); + upb_decoder_uninit(&decoder); + upb_stringsrc_uninit(&stringsrc); +} + +static size_t run(int i) +{ + (void)i; + upb_status status = UPB_STATUS_INIT; + upb_stringsrc_reset(&stringsrc, input_str, input_len); + upb_decoder_reset(&decoder, upb_stringsrc_bytesrc(&stringsrc), 0, UINT64_MAX, NULL); + upb_decoder_decode(&decoder, &status); + if(!upb_ok(&status)) goto err; + return input_len; + +err: + fprintf(stderr, "Decode error: "); + upb_status_print(&status, stderr); + return 0; +} -- cgit v1.2.3