将字符串转换为XML的最快方法

时间:2010-11-17 08:54:18

标签: c# string optimization building

嘿伙计们 - 有个问题。

我们有一个使用+ =(:()

的XMLIDList助手

我正在寻找的是最快的方法。这不是一个问题,因为列表已经有< 10项,但我们添加了一个新功能,可以传递15k项目,你可以想象..它的狗很慢!

  public static string EncodeGuidListToXML(IList<Guid> elementsToEncode)
        {
            if (elementsToEncode == null || elementsToEncode.Count == 0)
                return String.Empty;

            string beginItemNode = BeginItemNode;
            string endItemNode = EndItemNode; 

            string xml = BeginRootNode;

            foreach (Guid item in elementsToEncode)
            {
                xml += beginItemNode + item.ToString().ToUpper() + endItemNode;
            }

            xml += EndRootNode;

            return xml;
        }

感谢。

3 个答案:

答案 0 :(得分:7)

使用StringBuilder可以带来一些性能改进。

因为它“代表一个可变的字符串”,它在字符串操作上比直接连接字符串要快得多,因为它不必每次都复制字符串

答案 1 :(得分:4)

最好的方法是不要使用字符串连接来开始,IMO。使用XML API。构建XDocumentXmlDocument,然后将 转换为字符串。虽然你的逻辑目前相当简单,但只要你开始需要转义或需要转义的值,你真的不想复制真正的XML API的所有逻辑......所以使用现有的

以下是如何重写当前方法的示例:

public static string EncodeGuidListToXml(IList<Guid> guids)
{
    if (elementsToEncode == null || elementsToEncode.Count == 0)
    {
        return "";
    }
    return new XDocument(
        new XElement("Root",
            guids.Select(guid => new XElement("Item", guid.ToString().ToUpper()))
        )).ToString();

}

如果真的想要坚持直接构建字符串,StringBuilder确实是可行的方法。

答案 2 :(得分:3)

我使用标准字符串方法,StringBuilder类方法和使用XDocument和XElement类的方法运行了一些测试。使用短列表获得了StringBuilder类,但是对于更大的列表,XML类给出了相似的时间。我使用的测试代码如下:

List<string> list;
System.Diagnostics.Stopwatch timer = new System.Diagnostics.Stopwatch();

protected void Page_Load(object sender, EventArgs e)
{
    list = Enumerable.Range(0, 15000).Select(i => i.ToString()).ToList();
    UsingStrings();
    UsingStringBuilder();
    UsingXDocument();
}

private void UsingStrings()
{
    timer.Reset();
    timer.Start();
    string beginItemNode = "<Node>";
    string endItemNode = "</Node>";
    string xml = "<Root>";

    foreach (string item in list)
    {
        xml += beginItemNode + item + endItemNode;
    }

    xml += "</Root>";
    timer.Stop();
    Response.Write(string.Format("Strings time:{0}<br />", timer.Elapsed.Ticks));
}

private void UsingStringBuilder()
{
    timer.Reset();
    timer.Start();
    StringBuilder sb = new StringBuilder();
    sb.Append("<Root>");

    foreach (string item in list)
    {
        sb.AppendFormat("<Node>{0}</Node>", item);
    }

    sb.Append("</Root>");
    timer.Stop();
    Response.Write(string.Format("StringBuilder time:{0}<br />", timer.Elapsed.Ticks));
}

private void UsingXDocument()
{
    timer.Reset();
    timer.Start();
    XDocument xDoc = new XDocument();
    xDoc.Add(new XElement("Root"));
    foreach (var item in list)
    {
        XElement element = new XElement("Node", item);
        xDoc.Root.Add(element);
    }
    timer.Stop();
    Response.Write(string.Format("XDocument time:{0}<br />", timer.Elapsed.Ticks));
}

上述测试在我的机器上给出了以下结果:

First run:
    Strings time:239750613
    StringBuilder time:55509
    XDocument time:61904
Second run:

    Strings time:289422753
    StringBuilder time:198595
    XDocument time:80032

如果要将XDocument XML显示为字符串而不使用格式:

string xml = xDoc.ToString(SaveOptions.DisableFormatting);
编辑:我最初说XDocument要快得多,但运行测试几次似乎它通常等同于StringBuilder方法,虽然它似乎更一致,而有时StringBuilder更快,其他时候慢一点。显而易见的是,使用字符串相比要慢得多。