json, protobuf-c++,pbc,sproto 性能测试与解决方案
2015-06-24 19:41
716 查看
本文目的是比较这四个方法的优缺点,并给出解决方案。
OS: Linux(64位)
库的版本: lua5.1, luajit2.0,
注: 1. sproto库作者在代码中使用了lua5.2新库bitwise Operators,和我们使用的lua5.1环境不匹配,所以用能兼容lua5.2和lua5.1的库bit.numberlua代替 bitwise Operators。
2. 也尝试过用protoc-gen-lua,但解出来的table需要手动解析,而且耗费时间较大。
测 试数据:{"pbid":[{"id":100188,"value":3},{"id":100189,"value":3}, {"id":100190,"value":3}],"daily":[{"daily_id":1125,"date_id":[{"id":100188,"value":1}]},{"daily_id":1126,"date_id":[{"id":100118,"value":1}]}],"total":[{"id":100188,"value":1}],"segments":[{"type":1,"ct":1415384160,"ttl":1415384160,"id":100001}],"imp":[{"win":2,"bid":3,"time":8160,"id":100188},{"win":2,"bid":3,"time":8155,"id":100182},{"win":2,"bid":3,"time":8157,"id":100181}]}
方案一:protobuf-c++,特点:在时间耗费和空间占用上,优势很明显,但一旦有新需求要变动,维护起来较为复杂;
方案二:sproto,特点:在时间耗费和空间占用上,也非常有优势,维护起来很方便,具体请参考sproto:https://github.com/cloudwu/sproto ,pbc请参考:https://github.com/cloudwu/pbc;谢谢。
1. 测试环境说明
CPU: i3-2310M CPU @ 2.10GHzOS: Linux(64位)
库的版本: lua5.1, luajit2.0,
注: 1. sproto库作者在代码中使用了lua5.2新库bitwise Operators,和我们使用的lua5.1环境不匹配,所以用能兼容lua5.2和lua5.1的库bit.numberlua代替 bitwise Operators。
2. 也尝试过用protoc-gen-lua,但解出来的table需要手动解析,而且耗费时间较大。
2. 测试
2.0 测试函数接口说明
library | function interface | input/ output parameter | note | |
sproto | 1.en=cookie.encode(ab) 2.de=cookie.decode(en) | 1. input: ab is table 2. input: en is binary string | 1. the schema of the sproto is very strong and flexible 2. 编写proto文件非常简单而且很人性化 3. 使用简单易用 | |
sproto(nopack) | similar with sproto | similar with sproto | ||
pbc-lua |
| 1. input: CookieValue is table, 2. input en is binary | 这个decode出来的table是惰性展开的,访问该table时才能解开,不然会出现乱码 | |
protobuf-c++ |
| 1. input: tb is a table, 2.input: str is binary string | 1. 一有改动,较难维护 2. 耗费时间多小与压缩比效果很好,比其他的方法 | |
lua-cjson | 1. en=cjson.encode(tb) 2.de=cjson.decode(en) | 1. input: tb is a table, 2. input: en is cjson string | 1. 空间占用很大 2. 耗费时间过大 3. 优点:(对我们现有的使用来看)无须转换程序,即解即用 |
2.1 测试结果
library | encode times(1M次) | decode times(1M次) | size(byets) |
sproto | 4.6501181125641s | 11.385328769684s | 139 |
sproto(nopack) | 4.0319328308105s | 9.9806959629059s | 272 |
pbc-lua | 9.3938179016113s | 7.0795350074768s | 117 |
protobuf-c++ | 6.0948710441589s | 9.6896359920502s | 117 |
lua-cjson | 23.541377067566s | 15.335454940796s | 437 |
3. 结果分析
在“2.0 测试函数接口说明”中“note”栏,已经指出了这五种方法的优缺点,可以选择一下两种方案作为我们这次问题的解决方案:方案一:protobuf-c++,特点:在时间耗费和空间占用上,优势很明显,但一旦有新需求要变动,维护起来较为复杂;
方案二:sproto,特点:在时间耗费和空间占用上,也非常有优势,维护起来很方便,具体请参考sproto:https://github.com/cloudwu/sproto ,pbc请参考:https://github.com/cloudwu/pbc;谢谢。
相关文章推荐
- C语言常见错误
- [Effective C++] 读书笔记 I 书读百遍,其义自现
- [LeetCode] Regular Expression Matching
- C++ 原来 const 中所使用的函数 必须 全都具有 const 才行
- c++处理矩阵操作:Eigen库初步学习使用
- C++中static_cast, dynamic_cast用法
- C/C++中如何获取数组的长度?
- C++ 模板详解
- VS2010 C++ MFC框架学习笔记5 - C++面向对象编程基础1
- C语言的基本输入与输出函数(全解)
- JNI C C++ 区别
- C/C++宏定义中#与##区别
- smartFoxServer 2x C++环境的搭建
- VC++读取图像RGB值
- VC++读取图像RGB值
- C++类、结构、对象内存浅析(sizeof)(很重要)
- vs2012警告未能加载包“visual c++ package”
- 使用C语言计算utf-8字符串长度
- 【Effective C++ 读书笔记】导读 Introduction
- C++13.1复制控制