jsonp使用方法,json jsonp
JsonCpp使用优化搜索技术博客-淘宝
十一JsonCpp使用优化恨少最近一个项目在使用JsonCpp,JsonCpp简洁易用的接口让人印象深刻。但是在实际使用过程中,我发现JsonCpp的性能却不尽如人意,所以想着方法优化下性能。
代码理解
1、JsonCpp中一切都是价值,价值用联盟指向自己保存的数据价值。的类型分为两种,一种是容器类型,比如数组值和对象值。二者都是用地图保存数据,只是数组值的键为数字而已。另外一种是基本类型,比如字符串,整型数字等等。
2、解释数据数据时,JsonCpp在操作员[]函数开销比较大106 .JsonCpp内部使用std:map,查找性能方便,地图不如哈希映射,但是将地图替换成哈希映射有一定的困难,因为地图的键为CZString,而这个类又是价值的内部类,导致不能定义哈希映射需要的混杂结构体。
本来想尝试下内部地图,结果开启数据值使用内部地图这个宏之后,根本通不过编译,因为value.h中有一处联合声明里面居然放的是结构体,不知道什么编译器支持这种语法。
基准测试程序
扩展源帮助123457891 112131415161819 2022234 25265 int 64 _ t getCurrentTime(){ struct time val tval;gettimeofday( tval,NULL);返回(tval。TV _ sec * 1000000 ll tval。TV _ usec);} char * str= abcdefghijklmnopqrstuvwxyz ;void test1(){ int doc _ count=40;int outer _ field _ count=80 JSON:Value common _ info;int 64 _ t start _ time=getCurrentTime();for(size _ t I=0;I doc _ countI){ Json:Value AUC _ info;for(size _ t j=0;j外部_字段_计数;j){ AUC _ info。append(字符串);}常用信息。append(AUC _ info);} int 64 _ t end _ time=getCurrentTime();cout append time: end _ time-start _ time endl;} void test 2(){ int doc _ count=40;int outer _ field _ count=80 JSON:Value common _ info;int 64 _ t start _ time=getCurrentTime();JSON:Value AUC _ info;for(size _ t I=0;I doc _ countI){ for(size _ t j=0;j外部_字段_计数;j){ AUC _ info[j]=str;}常用信息。append(AUC _ info);} int 64 _ t end _ time=getCurrentTime();cout opt追加时间: end _ time-start _ time endl;} void test3(){ int doc _ count=40;int outer _ field _ count=80 JSON:Value common _ info;int 64 _ t start _ time=getCurrentTime();JSON:Value AUC _ info;for(size _ t I=0;I doc _ countI){ for(size _ t j=0;j外部_字段_计数;j){ AUC _ info[j]=Json:static string(str);}常用信息。append(AUC _ info);} int 64 _ t end _ time=getCurrentTime();cout 静态字符串time: end _ time-start _ time endl;}int main(int argc,const char * argv[]){ test1();test2();test3();返回0;}编译优化
默认情况下,JsonCpp编译时并没有带优化参数,自己可以加上优化参数Linux操作系统.环境下在下面这段代码中的CCFLAGS加入氧气。
1234 elif平台。以( Linux-gcc ):env开头.工具(默认)环境Append( LIBS=[pthread],cc flags=-Wall-fPIC O2 )env[ SHARED _ LIB _ ENABLED ]=True可以看到使用氧气优化比默认编译的版本性能提升一倍多。
1234567追加时间:4946opt追加时间:3326静态字符串时间:2750追加时间:1825磅追加时间:1082统计字符串时间:845使用方法上的优化
测试代码中第三种方法比第一种方法效率提升了一倍多。第三种方法之所以效率更高,有两个原因。
1、首先是在循环中一直复用auc_info对象。第一个循环就能将auc_info的长度初始化为doc_count。通过下标的访问方法,一直复用数组中的元素。
2、如果键和价值内存不会被释放,那么使用静态字符串效率会更高,省去了构造CZString时拷贝的开销。
代码优化
因为在JsonCpp中一切都是值,所以会有很多隐式的类型转换,会构造很多值对象。为了提高性能,我们可以绕过这种机制,牺牲实现的一致性。
因为最常用的值类型是字符串,所以在Value中添加了一个setValue函数。
1234567 void value:setValue(const static string value){ type _=string value;已分配_=false值_。string _=const _ cast char *(value . c _ str());}再次测试性能,可以发现性能比第三种方法有所提升。
234追加时间:1849 opt追加时间:1067 staticstring时间:843 setvaluetime: 570。最后是静态链接。CPP库本身很小,它的静态链接可以稍微提高性能。下面是静态链接时基准程序的耗时情况。
1234追加时间:1682追加时间:1011统计字符串时间:801设置值时间:541
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。