二种方法读取Protocol Buffer repeated字段的效率比较

定义测试用的Message:test.proto

message SubMsg {
   required uint32 n1 = 1;
   required uint32 n2 = 2;
}
message Msg {
   required uint32 n = 1;
   repeated SubMsg sub_msg = 2;
}
[root@slayer xx]# protoc test.proto --cpp_out=./

从Msg里面读取SubMsgd有两种方法:

SubMsg sub_msg(int index); 

SubMsg* mutable_sub_msg(int index); //取出指针,可以修改Msg的内容

MutableTest.cc

#include "test.pb.h"

#include "Poco/Timestamp.h"

#include <iostream>
#include <cstdlib>

// ===  FUNCTION  ======================================================================
//         Name:  main
//  Description:  main function
// =====================================================================================
   int
main ( int argc, char *argv[] )
{
   Msg msg;
   msg.set_n(0);
   for (int i = 0; i < 50000; ++i) {
      SubMsg* subMsg = msg.add_sub_msg();
      subMsg->set_n1(i);
      subMsg->set_n2(i * 2);
   }

   int n1, n2;
   Poco::Timestamp ts;
   for (int i = 0; i < msg.sub_msg_size(); ++i) {
      SubMsg subMsg = msg.sub_msg(i);
      n1 = subMsg.n1();
      n2 = subMsg.n2();
   }
   std::cout << "msg.sub_msg(): " << ts.elapsed() << std::endl;

   ts.update();
   for (int i = 0; i < msg.sub_msg_size(); ++i) {
      SubMsg* subMsg = msg.mutable_sub_msg(i);
      n1 = subMsg->n1();
      n2 = subMsg->n2();
   }
   std::cout << "msg.mutable_sub_msg(): " << ts.elapsed() << std::endl;

   return EXIT_SUCCESS;
}     // ----------  end of function main  ----------

结果

[root@slayer xx]# g++ test.pb.cc MutableTest.cc -lPocoFoundation -lprotobuf
[root@slayer xx]# ./a.out
msg.sub_msg(): 6552
msg.mutable_sub_msg(): 1681
[root@slayer xx]#

用mutable_sub_msg()明显快了不少。

转载于:https://www.cnblogs.com/Leo-Forest/archive/2013/05/24/3096544.html

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值