cjson encode性能问题

671 views
Skip to first unread message

wys0...@gmail.com

unread,
Mar 6, 2017, 10:37:38 AM3/6/17
to openresty
业务需要将table序列化,我使用了cjson的encode函数,进行了测试,发现encode太慢,有什么优化的方法或者可以替代cjson的库吗
测试结果如下:
第一次, 在cjson.encode之前就返回响应,qps为5.5w;
第二次, 执行cjson.encode之后再返回响应,qps为3.9w;

fishba...@gmail.com

unread,
Mar 6, 2017, 10:50:05 AM3/6/17
to openresty
这是必然,任何语言json_encode都是个坑。

在 2017年3月6日星期一 UTC+8下午11:37:38,wys0...@gmail.com写道:

fishba...@gmail.com

unread,
Mar 6, 2017, 11:01:45 AM3/6/17
to openresty
这位仁兄,你用了啥压力工具和环境配置,为啥我压测只有5000的qps,是咱们算法不一样?

在 2017年3月6日星期一 UTC+8下午11:50:05,fishba...@gmail.com写道:

wys0...@gmail.com

unread,
Mar 6, 2017, 11:21:52 AM3/6/17
to openresty
32核32G,启了32个worker,encode之前还有其他逻辑,有趣的是decode影响没这么大,只是从6.8w降到了6.5w

在 2017年3月7日星期二 UTC+8上午12:01:45,fishba...@gmail.com写道:

wys0...@gmail.com

unread,
Mar 6, 2017, 11:22:31 AM3/6/17
to openresty
压力工具是jmeter


在 2017年3月7日星期二 UTC+8上午12:01:45,fishba...@gmail.com写道:
这位仁兄,你用了啥压力工具和环境配置,为啥我压测只有5000的qps,是咱们算法不一样?

Zexuan Luo

unread,
Mar 7, 2017, 1:20:26 AM3/7/17
to openresty
之前我们有试过用 lua-rapidjson 替换掉 cjson 进行 encode。对于非常复杂、多层嵌套的 json 数据,lua-rapidjson 可以快接近 20%。不过对于普通的 json 数据,并没有明显变化,所以我们最终还是用回 cjson。
项目地址:https://github.com/xpol/lua-rapidjson

另一种思路是用 table concat 去手工拼字符串。之前有同事实现过这种优化,效果显著。缺点是可读性太差,每看一次头疼一次。后来吐嘈实在太多,就把这个优化回滚掉了 XD



在 2017年3月6日星期一 UTC+8下午11:37:38,wys0...@gmail.com写道:
业务需要将table序列化,我使用了cjson的encode函数,进行了测试,发现encode太慢,有什么优化的方法或者可以替代cjson的库吗

zhangh...@gmail.com

unread,
Mar 8, 2017, 10:19:28 PM3/8/17
to openresty
哈哈,同问题。
我火焰图打出来,40%性能消耗在json处理上。
因为数据要存到 ngx.shared.dict ,这里边又只能存字符串这种简单的数据结构。
只能说减少这个函数的使用了。


在 2017年3月6日星期一 UTC+8下午11:37:38,wys0...@gmail.com写道:
业务需要将table序列化,我使用了cjson的encode函数,进行了测试,发现encode太慢,有什么优化的方法或者可以替代cjson的库吗

DeJiang Zhu

unread,
Mar 10, 2017, 8:56:22 AM3/10/17
to open...@googlegroups.com
Hello

如果你的数据可以缓存的话,可以用 lrucache 当做二级缓存,我们经常这样使用
如果不能缓存就没那么好搞了

另外,如果你的数据结构简单,并且固定的话,也可以 shdict 配合 LuaJIT 的 cdata
比如 limit-traffic 的这个样例,不过还是挺的 tricky


--
--
邮件来自列表“openresty”,专用于技术讨论!
订阅: 请发空白邮件到 openresty+subscribe@googlegroups.com
发言: 请发邮件到 open...@googlegroups.com
退订: 请发邮件至 openresty+unsubscribe@googlegroups.com
归档: http://groups.google.com/group/openresty
官网: http://openresty.org/
仓库: https://github.com/agentzh/ngx_openresty
教程: http://openresty.org/download/agentzh-nginx-tutorials-zhcn.html

DeJiang Zhu

unread,
Mar 10, 2017, 8:57:28 AM3/10/17
to open...@googlegroups.com
另外,你也可以尝试一下 lua-resty-json

Zexuan Luo

unread,
Mar 12, 2017, 9:47:42 PM3/12/17
to open...@googlegroups.com
lua-resty-json 是个未完成品,只实现了 decode 部分……
https://github.com/cloudflare/lua-resty-json

之前我们考察 OpenResty 的 json 库时,也测试过 lua-resty-json 的 decode 性能,
对于复杂的 json 数据,确实有明显的提升。但是对于普通的 json 数据,性能提升不明显。
所以最终还是用回 cjson,毕竟它是标准库,而其他选择还没好到让我们可以放心地替换掉它。

wys0...@gmail.com

unread,
Mar 13, 2017, 2:41:04 AM3/13/17
to openresty
已经试过lua-resty-json,decode性能确实会提升,但不是很明显,encode暂时没有好的解决方案

在 2017年3月13日星期一 UTC+8上午9:47:42,Zexuan Luo写道:
订阅: 请发空白邮件到 openresty...@googlegroups.com
发言: 请发邮件到 open...@googlegroups.com
退订: 请发邮件至 openresty+...@googlegroups.com

--
--
邮件来自列表“openresty”,专用于技术讨论!
订阅: 请发空白邮件到 openresty...@googlegroups.com
发言: 请发邮件到 open...@googlegroups.com
退订: 请发邮件至 openresty+...@googlegroups.com

wys0...@gmail.com

unread,
Mar 31, 2017, 4:52:54 AM3/31/17
to openresty
昨天测试了rapidjson,性能跟cjson没有太大差异,不管是cjson还是rapidjson,CPU使用率都会升高不少

在 2017年3月7日星期二 UTC+8下午2:20:26,Zexuan Luo写道:

soul11201

unread,
Mar 31, 2017, 5:16:51 AM3/31/17
to open...@googlegroups.com
顺道来个数据,震惊 + 学习 一下 :)

--
--
邮件来自列表“openresty”,专用于技术讨论!
订阅: 请发空白邮件到 openresty+subscribe@googlegroups.com
发言: 请发邮件到 open...@googlegroups.com
退订: 请发邮件至 openresty+unsubscribe@googlegroups.com

Chad Cao

unread,
Jul 25, 2022, 9:19:39 PM7/25/22
to openresty
hi, all,这个问题后面有更好的思路么,目前在写一个日志收集转json发送到后端es存储库的openresty实现,发现json_encode着实很慢。
json_encode慢的原因是什么呢,是否可以利用ffi来优化呢

On Friday, March 31, 2017 at 5:16:51 PM UTC+8 soul11201 wrote:
顺道来个数据,震惊 + 学习 一下 :)

在 2017年3月31日 下午4:52, <wys0...@gmail.com>写道:
昨天测试了rapidjson,性能跟cjson没有太大差异,不管是cjson还是rapidjson,CPU使用率都会升高不少

在 2017年3月7日星期二 UTC+8下午2:20:26,Zexuan Luo写道:
之前我们有试过用 lua-rapidjson 替换掉 cjson 进行 encode。对于非常复杂、多层嵌套的 json 数据,lua-rapidjson 可以快接近 20%。不过对于普通的 json 数据,并没有明显变化,所以我们最终还是用回 cjson。
项目地址:https://github.com/xpol/lua-rapidjson

另一种思路是用 table concat 去手工拼字符串。之前有同事实现过这种优化,效果显著。缺点是可读性太差,每看一次头疼一次。后来吐嘈实在太多,就把这个优化回滚掉了 XD


在 2017年3月6日星期一 UTC+8下午11:37:38,wys0...@gmail.com写道:
业务需要将table序列化,我使用了cjson的encode函数,进行了测试,发现encode太慢,有什么优化的方法或者可以替代cjson的库吗
测试结果如下:
第一次, 在cjson.encode之前就返回响应,qps为5.5w;
第二次, 执行cjson.encode之后再返回响应,qps为3.9w;

--
--
邮件来自列表“openresty”,专用于技术讨论!
订阅: 请发空白邮件到 openresty...@googlegroups.com
发言: 请发邮件到 open...@googlegroups.com
退订: 请发邮件至 openresty+...@googlegroups.com
Reply all
Reply to author
Forward
0 new messages