rapidjson与protobuf对比测试

测试环境: 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;
	}

	
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值