杂记:记一次失败的从protobuf取内部数据。

开始:

大佬觉得protobuf反序列化后太占内存,让我想一个办法,在反序列化的时候,想一个办法直接把数据取出来,并且速度要比直接使用等于快,看一看有没有映射或者和memcpy差不多的办法。

过程:

首先test了直接用API把数据取出来,然后把原对象delete掉。发现,在运行1亿次反序列化的情况下,每一个等于会多增加1秒多。首先开始追踪API如何取数据的。

内部的私有变量,下图

发现了定长的数据是直接返回的,不定长数据string是调用一个方法返回的。

如下图

然后追踪不定长的数据这个函数。发现内部是new 一个string,然后把数据装上去,返回的,还有动态的内存扩大。然后思考了一下,类中new的动态数组是不能memcpy的,造成二次析构。遂罢。但是脑中崩出来一个很危险的想法,想试试玩玩。就直接动了google的编译器,把生成string析构掉的那段代码删掉,手动托管。还是失败。原因:没有花太多时间,看代码,毕竟只是玩一玩。

没有想过直接改生成的代码,大佬说编译器生成的不能改,后面还要改。耦合性太强。

------------------------------------------------------

然后第二种方法,进入库文件查找,在反序列化的时候出来的东西。

最后一条线找下去,一个一个函数看懂,最后发现google的代码写的真的好,低耦合,等等等。

下图这种宏定义方法,我是从来没见过的。6

直接用vs打开的文件,其中好多函数都找不到,搜索整个解决方案也查不到,封装了太多的层了。最后只有用一个boost::any全局变量,看一看。最后编译了好多次,还是找不到。但大概知道是哪个地方。而且我只看了string变长的方法,其他还没看。

最后使用反射API试了试,速度还没等于快。。。。。

收获:

虽然没有弄出来,但是对protobuf了解更加深刻了,不仅是使用还是其他一些方面,编译,转化为json,定义等等。

看到了google的样例代码,学到了很多。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值