Protocol Buffers - Google's data interchange format (grpc依赖) https://developers.google.com/protocol-buffers/
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

62 lines
1.3 KiB

// Tests speed of upb parsing into proto2 generated classes.
#define __STDC_LIMIT_MACROS 1
#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/pb/glue.h"
#include "upb/proto2_bridge.hpp"
#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;
static bool initialize()
{
// Read the message data itself.
str = upb_readfile(MESSAGE_FILE, &len);
if(str == NULL) {
fprintf(stderr, "Error reading " MESSAGE_FILE "\n");
return false;
}
def = upb::proto2_bridge::NewFinalMessageDef(msg2, &def);
msg2.ParseFromArray(str, len);
upb::Handlers* h = upb::Handlers::New();
upb::RegisterWriteHandlers(h, def);
plan = upb::DecoderPlan::New(h, JIT);
d.ResetPlan(plan, 0);
h->Unref();
return true;
}
static void cleanup() {
def->Unref(&def);
plan->Unref();
}
static size_t run(int i) {
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;
}