最近我们遇到了一段代码生成XML的性能问题。想在这里分享经验。这有点长,请耐心等待。字符串操作性能问题
我们编写一个简单的XML与一些项目。每个项目可以有5-10个元素。该结构是这样的:
<Root>
<Item>
<Element1Key>Element1Val</Element1Key>
<Element2Key>Element2Val</Element2Key>
<Element3Key>Element3Val</Element3Key>
<Element4Key>Element4Val</Element4Key>
<Element5Key>Element5Val</Element5Key>
<Item>
<Item>
<Element1Key>Element1Val</Element1Key>
<Element2Key>Element2Val</Element2Key>
<Element3Key>Element3Val</Element3Key>
<Element4Key>Element4Val</Element4Key>
<Element5Key>Element5Val</Element5Key>
<Item>
</Root>
产生为(以简化的形式作为全局函数)的XML代码:
void addElement(std::string& aStr_inout, const std::string& aKey_in, const std::string& aValue_in)
{
aStr_inout += "<";
aStr_inout += aKey_in;
aStr_inout += ">";
aStr_inout += "Elemem1Val";
aStr_inout += "<";
aStr_inout += aValue_in;
aStr_inout += ">";
}
void PrepareXML_Original()
{
clock_t commence,complete;
commence=clock();
std::string anXMLString;
anXMLString += "<Root>";
for(int i = 0; i < 200; i++)
{
anXMLString += "<Item>";
addElement(anXMLString, "Elemem1Key", "Elemem1Value");
addElement(anXMLString, "Elemem2Key", "Elemem2Value");
addElement(anXMLString, "Elemem3Key", "Elemem3Value");
addElement(anXMLString, "Elemem4Key", "Elemem4Value");
addElement(anXMLString, "Elemem5Key", "Elemem5Value");
anXMLString += "</Item>";
replaceAll(anXMLString, "&", "&");
replaceAll(anXMLString, "'", "'");
replaceAll(anXMLString, "\"", """);
replaceAll(anXMLString, "<", "<");
replaceAll(anXMLString, ">", ">");
}
anXMLString += "</Root>";
complete=clock();
LONG lTime=(complete-commence);
std::cout << "Time taken for the operation is :"<< lTime << std::endl;
}
所述的replaceAll()代码将与编码替换特殊字符形成。这在下面给出。
void replaceAll(std::string& str, const std::string& from, const std::string& to)
{
size_t start_pos = 0;
while((start_pos = str.find(from, start_pos)) != std::string::npos)
{
str.replace(start_pos, from.length(), to);
start_pos += to.length();
}
}
在最小的例子中,我编码了200项。但是,在实际情况下,这可能更多。上面的代码花费了大约20秒来创建XML。这远远超出了任何可接受的限度。可能是什么问题呢?如何提高这里的表现?
注:string类的使用并没有太大的区别。我使用MFC CString的另一个字符串实现测试了相同的逻辑,并且我得到了类似的(更糟糕的)观察。另外,我不想在这里使用任何DOM XML解析器以更好的方式准备XML。这个问题不是特定于XML。
什么是你运行了分析器的输出,正是它指向为瓶颈?分配?数据的副本? – PlasmaHH 2012-07-09 11:23:55
@PlasmaHH:我没有使用任何分析器,只是从功能输入时间,我能够得出结论,每个项目增加需要时间。请参阅下面的答案。通过以下修改,我能够大幅提升性能。 – PermanentGuest 2012-07-09 13:14:41