最近我們遇到了一段代碼生成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