Самый быстрый способ конвертировать строку в XML - PullRequest
3 голосов
/ 17 ноября 2010

Привет, ребята - Есть вопрос.

у нас есть помощник XMLIDList, который использует + = (:()

То, что я ищу, - это самый быстрый способ сделать это. Раньше это не было проблемой, потому что в списках было <10 элементов, но мы добавили новую функцию, которая может пропускать 15 тысяч элементов, и, как вы можете себе представить ... его собака медленная! </p>

  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 ]

7 голосов
/ 17 ноября 2010

Использование StringBuilder должно повысить производительность.

Поскольку он «представляет изменяемую строку символов», он гораздо быстрее обрабатывает строки, чем непосредственное объединение строк, поскольку ему не нужно каждый раз копировать строку

4 голосов
/ 17 ноября 2010

Лучший способ - не использовать конкатенацию строк для начала, 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 - действительно путь.

3 голосов
/ 17 ноября 2010

Я провел несколько тестов, используя ваш стандартный строковый метод, метод класса 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 быстрее, а иногда довольно медленнее. Ясно, что использование строк намного медленнее по сравнению.

...