开始:
大佬觉得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的样例代码,学到了很多。