JsonCpp使用优化
2012-11-02 10:14
1296 查看
JsonCpp使用优化 « 搜索技术博客-淘宝
十一
代码理解
1、JsonCpp中一切都是Value,Value用union指向自己保存的数据。Value的类型分为两种,一种是容器类型,比如arrayValue和objectValue。二者都是用map保存数据,只是arrayValue的key为数字而已。另外一种是基本类型,比如字符串,整型数字等等。
2、解释JSON数据时,JsonCpp在operator[]函数开销比较大。JsonCpp内部使用std::map,查找性能方便,map不如hash_map,但是将map替换成hash_map有一定的困难,因为map的key为CZString,而这个类又是Value的内部类,导致不能定义hash_map需要的hash结构体。
本来想尝试下internal map,结果开启JSON_VALUE_USE_INTERNAL_MAP这个宏之后,根本通不过编译,因为value.h中有一处uion声明里面居然放的是结构体,不知道什么编译器支持这种语法。
基准测试程序
+ expand source帮助
编译优化
默认情况下,JsonCpp编译时并没有带优化参数,自己可以加上优化参数。Linux环境下在下面这段代码中的CCFLAGS加入”O2″。
可以看到使用O2优化比默认编译的版本性能提升一倍多。
使用方法上的优化
测试代码中第三种方法比第一种方法效率提升了一倍多。第三种方法之所以效率更高,有两个原因。
1、首先是在循环中一直复用auc_info对象。第一个循环就能将auc_info的长度初始化为doc_count。通过下标的访问方法,一直复用数组中的元素。
2、如果key和value内存不会被释放,那么使用StaticString效率会更高,省去了构造CZString时拷贝的开销。
代码优化
因为在JsonCpp中一切都是Value,所以会有大量的隐性类型转换,要构造大量的Value对象。为了提高性能,可以在实现绕过这个机制,牺牲一致性。
因为Value最常用的类型是字符串,因此给Value增加一个setValue函数。
再测试一下性能,可以发现性能较第三种方法还有提升。
最后还有一个办法就是静态链接。JsonCpp库本身非常小,将其静态链接能稍微提升一点性能。下面是静态链接时基准测试程序的耗时情况。
十一
JsonCpp使用优化 恨少
最近一个项目在使用JsonCpp,JsonCpp简洁易用的接口让人印象深刻。但是在实际使用过程中,我发现JsonCpp的性能却不尽如人意,所以想着方法优化下性能。代码理解
1、JsonCpp中一切都是Value,Value用union指向自己保存的数据。Value的类型分为两种,一种是容器类型,比如arrayValue和objectValue。二者都是用map保存数据,只是arrayValue的key为数字而已。另外一种是基本类型,比如字符串,整型数字等等。
2、解释JSON数据时,JsonCpp在operator[]函数开销比较大。JsonCpp内部使用std::map,查找性能方便,map不如hash_map,但是将map替换成hash_map有一定的困难,因为map的key为CZString,而这个类又是Value的内部类,导致不能定义hash_map需要的hash结构体。
本来想尝试下internal map,结果开启JSON_VALUE_USE_INTERNAL_MAP这个宏之后,根本通不过编译,因为value.h中有一处uion声明里面居然放的是结构体,不知道什么编译器支持这种语法。
基准测试程序
+ expand source帮助
默认情况下,JsonCpp编译时并没有带优化参数,自己可以加上优化参数。Linux环境下在下面这段代码中的CCFLAGS加入”O2″。
测试代码中第三种方法比第一种方法效率提升了一倍多。第三种方法之所以效率更高,有两个原因。
1、首先是在循环中一直复用auc_info对象。第一个循环就能将auc_info的长度初始化为doc_count。通过下标的访问方法,一直复用数组中的元素。
2、如果key和value内存不会被释放,那么使用StaticString效率会更高,省去了构造CZString时拷贝的开销。
代码优化
因为在JsonCpp中一切都是Value,所以会有大量的隐性类型转换,要构造大量的Value对象。为了提高性能,可以在实现绕过这个机制,牺牲一致性。
因为Value最常用的类型是字符串,因此给Value增加一个setValue函数。
相关文章推荐
- jsonCpp使用介绍和优化
- JsonCpp使用优化
- JsonCpp 生成的Lib使用时出现unresolved external symbol
- VS下 jsoncpp的编译使用教程
- Cocos-ext部分功能的使用:jsonCpp,CCTableView的滚动和“查看更多”
- 【优化】JSON.stringify()使用优化
- 【存储】Cocos2d-x使用JsonCpp
- Linux中jsoncpp的安装和使用
- Jsoncpp的使用
- 【C++】JSON数据解析——jsoncpp的使用(下)
- 使用JsonCPP解析JSON数据(VC++)
- Jason库的使用【C++】(jsoncpp)
- jsoncpp 库的使用方法
- JSON数据解析——jsoncpp的使用(上)
- linux下jsoncpp的编译安装使用,centos6.5最小化安装后如何选择安装包
- [C++]Jsoncpp的使用
- Jsoncpp的使用
- jsoncpp的简单使用
- VS 2008 jsoncpp的配置及使用实例
- c++ 第三方json解析库 jsoncpp的使用