测试环境: windows10 x64 vs2017 编译release版本
格式定义:任务包括ID号,和64个链路信息,链路中包括经纬度高程信息;
syntax = "proto3";
package pathloss;
option optimize_for = LITE_RUNTIME;
message req_job_t
{
string job_id = 1;
string time_str = 2;
message link_info_t
{
int32 link_idx = 1;
double lat = 2;
double lon = 3;
double alt = 4;
double freq = 5;
}
repeated link_info_t links = 3;
}
message job_result_t
{
string job_id = 1;
message link_result_t
{
int32 link_idx = 1;
double loss_db = 2;
}
repeated link_result_t link_results = 2;
}
1)protobuf:编码长度2484字节,耗时4.5~13微秒;解码:7 ~10微秒; 不知道为啥有时会波动很大;
2)rapidjson:编码长度2892字节,耗时13~14微秒;解码:19~20微秒; 波动很小
备注:
protobuf测试代码:
char buffer[1024*64];
char buffer1[1024 * 64];
Timer timer;
req_job_t reqJob;
reqJob.set_job_id("AA2021-07-07-18:37:06.123");
reqJob.set_time_str("2021-07-07-18:37:06.123");
for (int i=0; i<64; i++)
{
req_job_t_link_info_t * link = reqJob.add_links();
link->set_alt(50);
link->set_link_idx(0);
link->set_lat(39);
link->set_freq(1000000);
link->set_lon(116);
}
timer.start();
bool ret = reqJob.SerializeToArray(buffer, 1024*64);
int sz = reqJob.ByteSizeLong();
//std::string info = reqJob.SerializeAsString();
//int len = info.length();
double t = timer.stop_delta<Timer::ms>();
std::cout << "time:" << t << std::endl;
std::cout << "长度:" << sz << std::endl;
//std::cout << info << std::endl;
timer.start();
req_job_t reqJob1;
reqJob1.ParseFromArray(buffer, sz);
t = timer.stop_delta<Timer::ms>();
std::cout << "time:" << t << std::endl;
ret = reqJob1.SerializeToArray(buffer1, 1024 * 64);
//std::string info1 = reqJob.SerializeAsString();
ret = memcmp(buffer, buffer1, sz);
if (ret == 0)
{
std::cout << "ok" << std::endl;
}
fastjson的测试代码:
void testWraperRAW()
{
Timer timer;
char buffer[1024 * 64];
timer.start();
RawBufferWrapper wraper(buffer, 1024 * 64);
Writer <RawBufferWrapper> writer(wraper);
writer.StartObject(); // Between StartObject()/EndObject(),
writer.Key("job_id"); // output a key,
writer.String("AA2021-07-07-18:37:06.123"); // follow by a value.
writer.Key("tm_str");
writer.String("AA2021-07-07-18:37:06.123");
writer.Key("links");
writer.StartArray(); // Between StartArray()/EndArray(),
for (unsigned i = 0; i < 64; i++)
{
writer.StartObject();
writer.Key("id");
writer.Int(i);
writer.Key("lat");
writer.Double(39);
writer.Key("lon");
writer.Double(116);
writer.Key("alt");
writer.Double(50);
writer.EndObject();
}
writer.EndArray();
writer.EndObject();
double t = timer.stop_delta<Timer::ms>();
char * p = (char *)buffer;
wraper.Put('\0');
cout <<"time:" << t << endl;
std::cout << "len:" << wraper.Tell() << endl;
timer.start();
Document d;
d.Parse(buffer, wraper.Tell());
t = timer.stop_delta<Timer::ms>();
cout << "time:" << t << endl;
if (d.HasParseError())
{
ParseErrorCode errCode = d.GetParseError();
size_t off = d.GetErrorOffset();
cout << "JSON parse error: " << GetParseError_En(errCode) << "off:" << off << endl;
std::cout << p + 75 << endl;
}
}