最近,我们遇到了一段生成 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。这远远超出了任何可接受的限度。可能是什么问题呢?以及如何提高这里的性能?
注意:字符串类的用法没有太大区别。我用 MFC CString 的另一个字符串实现测试了相同的逻辑,我得到了类似(更糟)的观察结果。另外,我不想在这里使用任何 DOM XML 解析器来以更好的方式准备 XML。这个问题并不特定于 XML。