2010-11-17 48 views
3

嘿家伙 - 有个问题。将字符串转换为XML的最快方法

我们已经得到它使用一个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

最好的办法是不要使用字符串连接来启动与国际海事组织。使用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确实是要走的路。

+0

速度是一个字符串生成器?这看起来像要走的路虽然.. – Steoates 2010-11-17 09:21:49

+0

如果顺序不重要,列表通常很大,有人可以'.AsParallel()' - 它呢? – 2010-11-17 09:56:29

+0

订单并不重要,但大多数情况下,这些清单最多不超过50件,但有一些情况可能超过100件,但有点帮助! – Steoates 2010-11-17 09:58:29

7

使用StringBuilder应该给你一些性能改进。

,因为它“代表了一个可变的字符字符串”它的速度更快的字符串操作不是直接连接字符串,因为它不必每次都复制字符串

+0

是的 - 我改变它在第一次使用。我只是希望有更好的嘿嘿:) – Steoates 2010-11-17 09:02:01

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方法,虽然它似乎更加con有时候StringBuilder会更快,其他时候会慢一些。很明显,使用字符串比较慢得多。

相关问题