推广 热搜: page  关键词  数据分析  服务  数据分析系统  搜索  获取  哪些  链接  搜索引擎 

jsoncpp 执行效率优化,非常规极限优化,适合linux下, 效率几乎提高50%以上

   日期:2025-01-03     作者:e0r9m    caijiyuan   评论:0    移动:https://sicmodule.kub2b.com/mobile/news/14993.html
核心提示:这是2年多前, 一个游戏服务器项目要上线了,协议消息处理和数据存放都基本用json的,用的是jsoncpp开源库 主

这是2年多前, 一个游戏服务器项目要上线了,协议消息处理和数据存放都基本用json的,用的是jsoncpp开源库


主要逻辑处理部分是单线程处理,所以玩家一多cpu就吃不消了, 要优化


用gprof等工具找啊找研究发现是 主要json部分引起的一些内存开销占用cpu资源过多。(还有一些智能指针,按下不表


找了很多方法优化jsoncpp

1.比如 http://www.2cto.com/kf/201211/172375.html

只优化了一些。


2.另外, Json::Value对象有个 swap接口,所有的 赋值操作能改 swap的都用swap(因为直接 = 赋值,会做一次对象拷贝

3. 然后 数据嵌套的 基本不用append , 都用  Json::Value &one = jv_test[jv_test.size()];  先取出来再赋值,这样就省了 append时的一次拷贝

4.StyledWriter尽量都变成 FastWriter的格式化

但改了好多代码,只是稍稍提高了点效率

5. 继续修改jsoncpp源码 把注释的处理代码去掉,好像用处也不大。


后来仔细看了一下jsoncpp代码, 发现 特别是writer里面, 有个字符串document_ 一直再 += , 拼接字符串

原先代码 没用用一个统一的writer格式化, 很多都是用toStyledString()



std::string Value::toStyledString() const {
  //StyledWriter writer;
  FastWriter writer;
  return writer.write(*this);
}



可想而知 这个document_ 这个字符串容器在 拼接字符串要分配多少次内存哈,不可想象。

如果改代码,量太大

就直接改底层的

一、writer.h里 注掉

 //std::string document_;

二、json_writer.h里改一下代码   

使用一个 线程级的 全局静态变量 替换 document_; 

 


整体效率一下提高了50% - -

是保证多线程下没有问题。 


reader也可以优化看看。


这个优化如果有需要可以拿去试试。   个人觉得全局 统一用一个writer来输出也不错(不过要注意多线程的问题)。

本文地址:https://sicmodule.kub2b.com/news/14993.html     企库往 https://sicmodule.kub2b.com/ , 查看更多

特别提示:本信息由相关用户自行提供,真实性未证实,仅供参考。请谨慎采用,风险自负。

 
 
更多>同类最新资讯
0相关评论

文章列表
相关文章
最新动态
推荐图文
最新资讯
点击排行
网站首页  |  关于我们  |  联系方式  |  使用协议  |  版权隐私  |  网站地图  |  排名推广  |  广告服务  |  积分换礼  |  网站留言  |  RSS订阅  |  违规举报  |  鄂ICP备2020018471号