« 让多个 Lua state 共享一份静态数据 | 返回首页 | 开发笔记(18) : 读写锁与线程安全 »

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上提交给你看看
我不太想再花精力维护 但如果你能解决问题提交 pr 我很乐意 review 代码并合并到主干.
另外,还有一个bug。 就是decode返回的表,若新加一个字段,内容是表,不能encode,因为在 pairs 循环时,没有这个字段,为何会添加不进去呢?
云风,那个lua的pbc绑定,有个很怪异的bug,用的数lua5.3的绑定。 就是表中string的一个对象,在改变值后,在encode时,string的值变回了以前的值,但是在改变其值前,获取其元表,或类型,就正常了,可能是啥地方的原因,这个困扰我很久了。 如果描述不太清楚,可以继续用其他的方式交流。
用了云大侠的pbc,发现点问题,希望帮忙看一下http://blog.csdn.net/zlqqhs/article/details/40382069
Thank you for your sharing
开源啦,果断学习. github比sourceforge快很多啊
请教一下各位大虾,把一个基础数据类型放在结构体里有什么好处啊 比如: typedef uint32_t in_addr_t; struct in_addr { in_addr_t s_addr; }; typedef uint32_t in_addr; //这个和上面不也一样么?
性能关键部分,我还是推荐 pattern 模式 pattern模式是神马模式?笔误?
先开辟一个定长的框子,里面放一些格子?不是很理解

Post a comment

非这个主题相关的留言请到:留言本