XmlDocument vs StringBuilder
Потестил перфоманс создания xml через XmlDocument и StringBuilder.
В моем приложении результаты получились такие:
XmlDocument: 0.2151
StringBuilder: 0.3114
В моем случае если записывать в Xml нечего, то надо было вернуть string.Empty. Для этого случая результаты такие:
XmlDocument: 0.00778
StringBuilder: 0.01386
кусочек кода на всякий случай:
/// <summary>
/// Creates xml with calculated volume share values.
/// </summary>
/// <param name="suppliersData">Collection with calculated values.</param>
/// <param name="startIndex">Position of first supplier to be added into xml.</param>
/// <param name="endIndex">Position of last supplier to be added into xml.</param>
/// <returns>Xml with calculated data || empty string if there is no values to be loaded into db for specifeid portion of suppliers.</returns>
private static string GetVolumeShare(SupplierDataCollection suppliersData, int startIndex, int endIndex)
{
XmlDocument xmlDoc = new XmlDocument();
XmlNode root = xmlDoc.CreateElement("root");
for (int i = startIndex; i <= endIndex; i++)
{
SupplierData supplierData = suppliersData[i];
foreach (SupplierYearData supplierYearData in supplierData.YearVolumes)
{
foreach (SupplierCSData supplierCSData in supplierYearData.CSVolumes)
{
if (supplierCSData.CSVolumeShare > 0)
{
XmlNode child = xmlDoc.CreateElement("vs");
XmlAttribute childAttr = xmlDoc.CreateAttribute("SRMSId");
childAttr.Value = supplierData.SupplierId.ToString();
child.Attributes.Append(childAttr);
childAttr = xmlDoc.CreateAttribute("CS");
childAttr.Value = supplierCSData.CSId.ToString();
child.Attributes.Append(childAttr);
childAttr = xmlDoc.CreateAttribute("year");
childAttr.Value = supplierYearData.Year.ToString();
child.Attributes.Append(childAttr);
childAttr = xmlDoc.CreateAttribute("value");
childAttr.Value = supplierCSData.CSVolumeShare.ToString();
child.Attributes.Append(childAttr);
root.AppendChild(child);
}
}
}
}
if (root.ChildNodes.Count > 0)
xmlDoc.AppendChild(root);
string xmlData = xmlDoc.InnerXml;
return xmlData;
}
private static string GetVolumeShareXml(SupplierDataCollection suppliersData, int startIndex, int endIndex)
{
StringBuilder sbChilds = null;
for (int i = startIndex; i <= endIndex; i++)
{
SupplierData supplierData = suppliersData[i];
foreach (SupplierYearData supplierYearData in supplierData.YearVolumes)
{
foreach (SupplierCSData supplierCSData in supplierYearData.CSVolumes)
{
if (supplierCSData.CSVolumeShare > 0)
{
if (sbChilds == null)
sbChilds = new StringBuilder();
/*
sbChilds.Append(
string.Format("<vs SRMSId=\"{0}\" CS=\"{1}\" year=\"{2}\" value=\"{3}\" />",
supplierData.SupplierId,
supplierCSData.CSId,
supplierYearData.Year,
supplierCSData.CSVolumeShare
)
);
*/
sbChilds.Append("<vs SRMSId=\"");
sbChilds.Append(supplierData.SupplierId);
sbChilds.Append("\" CS=\"");
sbChilds.Append(supplierCSData.CSId);
sbChilds.Append("\" year=\"");
sbChilds.Append(supplierYearData.Year);
sbChilds.Append("\" value=\"");
sbChilds.Append(supplierCSData.CSVolumeShare);
sbChilds.Append("\" />");
}
}
}
}
StringBuilder sbRoot = null;
if (sbChilds != null)
{
sbRoot = new StringBuilder();
sbRoot.Append("<root>");
sbRoot.Append(sbChilds);
sbRoot.Append("</root>");
}
return sbRoot != null ? sbRoot.ToString() : string.Empty;
}
П.С.: замена StringBuilder на string.Format никакого эффекта не дало, как собсно я и ожидал.
No comments:
Post a Comment