3

我们有一个 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;
        }
4

3 回答 3

7

使用 aStringBuilder应该会给您一些性能改进。

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

于 2010-11-17T08:55:52.043 回答
4

最好的方法是不要使用字符串连接开始,IMO。使用 XML API。构建一个XDocument或一个XmlDocument,然后将转换为最后的字符串。虽然目前您的逻辑相当简单,但一旦您开始需要需要转义的值或类似的东西,您真的不想复制真实 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确实是要走的路。

于 2010-11-17T09:12:38.173 回答
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 更快,其他时候则慢一些。很明显,相比之下使用字符串要慢得多。

于 2010-11-17T09:30:38.070 回答