自写的bson转成string类型函数,效率太低,求大神优化

Sarielisa 2017-06-12 03:43:07
自写了一段将bson格式转换成string类型的程序,思路比较线性,测试的时候发现效率很低,将一个有大概2千个对象的bson格式转换成string要花将近200秒,望大家提些优化的建议,效率至少要提高4倍这个程序才有可用性·····
string bsonFullToString(bson::bo obj)//入口
{
if (obj.isEmpty()) return "{}";
bson::StringBuilder s;
bool isArray = false;
tranBoToString(obj,s,isArray);
return s.str();
}

void tranBoToString(const bson::bo& obj, bson::StringBuilder& s, bool isArray)//对象转换
{
if(obj.isEmpty())
{
s << "{}";
return ;
}
s << ( isArray ? "[ " : "{ " );
bson::BSONObjIterator iter(obj);
bool first = true;
while (1)
{
bson::BSONElement e = iter.next(true);
e.validate();
if(e.eoo())//判断e是不是该对象的结束
{
break;
}
if ( first )
{
first = false;
}
else
{
s << ", ";
}
tranBeToString(e,s,!isArray);
}
s << ( isArray ? " ]" : " }" );
}

void tranBeToString(bson::be& e, bson::StringBuilder& s, bool isArray)//元素转换
{
if ( isArray && e.type() != bson::EOO )
{
s << e.fieldName() << ": ";
}
switch(e.type())
{
case bson::EOO:
s << "EOO";
break;
case bson::Bool:
s << (e.boolean() ? "true": "false");
break;
case bson::NumberInt:
s<<e._numberInt();
break;
case bson::NumberDouble:
s.appendDoubleNice(e.number());
break;
case bson::String:
{
s << '"';
s << e.String();
//string tmp = s.str();
s << '"';
break;
}
case bson::Object:
tranBoToString(e.embeddedObject(),s,false);
break;
case bson::Array:
tranBoToString(e.embeddedObject(),s,true);
break;
case bson::jstNULL:
s << "null";
break;
default:
s << "?type=" << e.type();
break;
}
}
...全文
523 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Acuity. 2017-06-12
  • 打赏
  • 举报
回复
引用 4 楼 zhao4zhong1 的回复:
无profiler不要谈效率!!尤其在这个云计算、虚拟机、模拟器、CUDA、多核 、多级cache、指令流水线、多种存储介质、……满天飞的时代!
赵4老师回答总是这么6
walkereklaw 2017-06-12
  • 打赏
  • 举报
回复
没用过,没看过。 应该会有提供转换成json或者特定格式的方法。看源码。 看是不是有地方在不断新建对象,拷贝操作。
赵4老师 2017-06-12
  • 打赏
  • 举报
回复
无profiler不要谈效率!!尤其在这个云计算、虚拟机、模拟器、CUDA、多核 、多级cache、指令流水线、多种存储介质、……满天飞的时代!
赵4老师 2017-06-12
  • 打赏
  • 举报
回复
在文件大小相同的前提下: 读刚读过的文件比头次读没读过的文件快 读转速快的硬盘上的文件比读转速慢的硬盘上的文件快 读没有磁盘碎片的文件比读有磁盘碎片的文件快 读文件不处理比边读边处理快 单线程从头到尾一次读文件比多线程分别读文件各部分快(非固态硬盘上) 读固态硬盘上的文件比读普通硬盘上的文件快 您是否希望迅速对您频繁使用的文件进行碎片整理?使用 Contig 优化单个的文件,或者创建连续的新文件。http://technet.microsoft.com/zh-cn/sysinternals/bb897428
Sarielisa 2017-06-12
  • 打赏
  • 举报
回复
<<操作是对每个元素的操作,没办法减少呀。 是在release下的,几千个元素就要好几分钟了。
幻夢之葉 2017-06-12
  • 打赏
  • 举报
回复
感觉bson::StringBuilder的 << 频繁操作会占用很多时间 减少此类操作或者使用其他方式替换试试 测试用release进行测试,2000的对象会花200s的时间?
代码下载链接: https://pan.quark.cn/s/a4b39357ea24 Webpack所提供的实时更新功能显著提升了前端开发的工作效率,以下将介绍针对vuecli实时更新无法正常工作的解决策略: 1、审查控制台,在编译期间留意是否存在任何提示信息,这些提示信息极有可能引发实时更新的中断 2、对于vueCli3.0版本及后续版本,需注意避免使用cnpm来安装依赖库,应选用npm进行安装 以上即为解决vuecli3.0实时更新失效问题的全部分享内容,期望能为读者提供有益的参考,并期待大家给予软件开发网更多的支持 在前端构建过程中,Vue CLI 3.0是一个极具效能的工具,它提供了便捷的项目构建初始化、配置管理以及构建流程等功能。然而,一旦热更新(Hot Module Replacement,HMR)功能无法正常运作,将严重阻碍开发效率,因为每次代码的变更都需要手动刷新浏览器才能观察到结果。本文将详尽阐述如何处理Vue CLI 3.0热更新无法启动的问题 热更新作为webpack的核心特性之一,它使得开发者能够在无需完整刷新页面的情况下更新模块,从而迅速预览代码的修改结果。当热更新功能出现故障时,可能的原因多种多样,我们需要逐一进行排查。 1. **审查控制台中的提示信息**:当热更新出现异常时,首要步骤是检查开发模式下浏览器控制台所显示的输出内容。编译过程中的提示信息可能会造成热更新功能的失效。这些提示通常与代码的类型校验、ESLint规则或依赖库版本的不匹配有关。通过解决这些问题并消除提示,有助于恢复热更新功能。例如,确保所有导入路径准确无误,避免使用未声明的变量,或更新至兼容的库版本。 2. **避免使用cnpm安装依赖项**:cnpm是由淘宝...
全新UI轻量级网盘系统源码 Web端轻量级网盘系统,整体UI风格参考百度网盘/夸克网盘,采用蓝白配色、简洁现代的设计风格。底部导航分为5个标签:首页、文件、传输、信息、我的,体验贴近主流网盘App。 技术栈为 PHP8.0+,部署门槛低,适合个人或小团队快速搭建私有云盘。 核心功能一览 功能模块 能力说明 文件管理 文件的增删改查、文件夹层级导航、批量操作(批量删除/下载)、拖拽或点击上传、新建文件夹 文件预览 支持图片、视频、文档等常见文件类型的在线预览 文件分享 生成加密分享链接+提取码,可设置有效期(7天/30天/永久)和访问次数限制,支持随时吊销 传输管理 上传/下载任务列表,实时显示进度,支持任务筛选(全部/已完成/进行中/失败),支持磁力链接搜索下载 好友与聊天 添加好友、好友列表、用户间聊天窗口、聊天中直接发送文件,好友可保存文件到自己的网盘 回收站 删除文件进入回收站保留30天,支持恢复或手动彻底删除 云收藏 用户可收藏文件,集中管理 隐私空间 独立加密空间,可设置密码保护 文件清理 扫描重复文件、大文件、临时文件,一键清理释放空间 FTP连接 每个用户可填写独立的FTP服务器地址、端口、账号,通过FTP客户端连接网盘上传下载,也可在「我的」页面查看和复制FTP信息

65,213

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧