pbc 优化
最近几天优化了一下 pbc 。
这是一个大改动,所以写 blog 记录一下。
首先,我为 rmessage 定制了一个 heap alloc ,在使用 rmessage 解包的时候不再调用系统的 malloc 。而是从一个连续内存 heap 上取用内存。这样在删除 rmessage 对象时也会更快。因为只需要把 heap 回收即可。
当然这样会导致 rmessage 解包时用到的内存增加。对于内存紧张,性能关键部分,我还是推荐 pattern 模式。虽然比较难用,但可以保证时间和空间性能。
另外,我增加了 upb 的 Event-based parsing 模式,见新增接口 pbc_decode
。
不过我认为这个 api 不适合直接在 C 里调用,但是用来做动态语言的 binding 不错。现在 lua binding 中的 decode 就改用这个实现了。这样每次解包就把所有项都解出来,而不用附着一个 userdata 。回避了手动调用 close_decoder
的问题。
btw, 根据一个同学使用的反馈,他们大多不主动调用 close_decoder
,而依赖 gc 回收 decode 过程中产生的 C 对象。但是这些 C 对象申请的内存不会通知 lua ,所以 lua 的 gc 触发条件不会及时触发。这使得 pbc 的 lua binding 可能占用大量内存。我这次的修改主要针对这个问题。
Comments
好,我整理一下,测试没啥问题了,git上提交给你看看
Posted by: lanmao | (10) August 11, 2015 07:47 PM
我不太想再花精力维护
但如果你能解决问题提交 pr 我很乐意 review 代码并合并到主干.
Posted by: Cloud | (9) August 10, 2015 09:41 PM
另外,还有一个bug。
就是decode返回的表,若新加一个字段,内容是表,不能encode,因为在 pairs 循环时,没有这个字段,为何会添加不进去呢?
Posted by: lanmao | (8) August 9, 2015 09:38 PM
云风,那个lua的pbc绑定,有个很怪异的bug,用的数lua5.3的绑定。
就是表中string的一个对象,在改变值后,在encode时,string的值变回了以前的值,但是在改变其值前,获取其元表,或类型,就正常了,可能是啥地方的原因,这个困扰我很久了。
如果描述不太清楚,可以继续用其他的方式交流。
Posted by: lanmao | (7) August 9, 2015 09:02 PM
用了云大侠的pbc,发现点问题,希望帮忙看一下http://blog.csdn.net/zlqqhs/article/details/40382069
Posted by: Amtm | (6) October 23, 2014 11:07 AM
Thank you for your sharing
Posted by: ed hardy uk | (5) May 15, 2012 02:32 PM
开源啦,果断学习.
github比sourceforge快很多啊
Posted by: lsccsl | (4) May 4, 2012 09:23 AM
请教一下各位大虾,把一个基础数据类型放在结构体里有什么好处啊
比如:
typedef uint32_t in_addr_t;
struct in_addr { in_addr_t s_addr; };
typedef uint32_t in_addr; //这个和上面不也一样么?
Posted by: zzzyyxzzz | (3) April 27, 2012 04:40 PM
性能关键部分,我还是推荐 pattern 模式
pattern模式是神马模式?笔误?
Posted by: mayao11 | (2) April 26, 2012 07:31 PM
先开辟一个定长的框子,里面放一些格子?不是很理解
Posted by: 惠盈盈 | (1) April 26, 2012 07:22 PM