jsonp实现原理解析(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声明里面居然放的是结构体 ,不知道什么编译器支持这种语法 。
基准测试程序
编译优化
默认情况下 ,JsonCpp编译时并没有带优化参数 ,自己可以加上优化参数 。Linux环境下在下面这段代码中的CCFLAGS加入 ”O2″ 。
可以看到使用O2优化比默认编译的版本性能提升一倍多 。
使用方法上的优化
测试代码中第三种方法比第一种方法效率提升了一倍多。第三种方法之所以效率更高 ,有两个原因 。
1 、首先是在循环中一直复用auc_info对象 。第一个循环就能将auc_info的长度初始化为doc_count。通过下标的访问方法 ,一直复用数组中的元素 。
2 、如果key和value内存不会被释放 ,那么使用StaticString效率会更高 ,省去了构造CZString时拷贝的开销 。
代码优化
因为在JsonCpp中一切都是Value ,所以会有大量的隐性类型转换 ,要构造大量的Value对象 。为了提高性能,可以在实现绕过这个机制 ,牺牲一致性 。
因为Value最常用的类型是字符串 ,因此给Value增加一个setValue函数 。
再测试一下性能,可以发现性能较第三种方法还有提升 。
最后还有一个办法就是静态链接 。JsonCpp库本身非常小 ,将其静态链接能稍微提升一点性能 。下面是静态链接时基准测试程序的耗时情况 。
创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!