自写的bson转成string类型函数,效率太低,求大神优化
自写了一段将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;
}
}