Я хотел посмотреть, какое из этих предложенных решений работает лучше всего, поэтому я провел несколько сравнительных тестов. Из интереса я также сравнил методы LINQ с простым старым методом System.Xml, предложенным Грегом. Вариация была интересной и не такой, как я ожидал: самые медленные методы были более чем в 3 раза медленнее, чем самые быстрые .
Результаты упорядочены от самых быстрых до самых медленных:
- CreateReader - Instance Hunter (0,113 секунды)
- Обычный старый System.Xml - Грег Херлман (0,134 секунды)
- Агрегат с конкатенацией строк - Майк Пауэлл (0,324 секунды)
- StringBuilder - Vin (0,333 секунды)
- String.Join на массив - Терри (0,360 секунд)
- String.Concat по массиву - Марчин Косерадзки (0.364)
метод
Я использовал один XML-документ с 20 одинаковыми узлами (называемый «подсказка»):
<hint>
<strong>Thinking of using a fake address?</strong>
<br />
Please don't. If we can't verify your address we might just
have to reject your application.
</hint>
Числа, показанные в секундах выше, являются результатом извлечения «внутреннего XML» из 20 узлов 1000 раз подряд и получения среднего (среднего) из 5 запусков. Я не включил время, необходимое для загрузки и синтаксического анализа XML в XmlDocument
(для метода System.Xml ) или XDocument
(для всех остальных).
Я использовал следующие алгоритмы LINQ: (C # - все берут XElement
«родителя» и возвращают внутреннюю строку XML)
CreateReader:
var reader = parent.CreateReader();
reader.MoveToContent();
return reader.ReadInnerXml();
Агрегировать с конкатенацией строк:
return parent.Nodes().Aggregate("", (b, node) => b += node.ToString());
StringBuilder:
StringBuilder sb = new StringBuilder();
foreach(var node in parent.Nodes()) {
sb.Append(node.ToString());
}
return sb.ToString();
String.Join на массив:
return String.Join("", parent.Nodes().Select(x => x.ToString()).ToArray());
String.Concat в массиве:
return String.Concat(parent.Nodes().Select(x => x.ToString()).ToArray());
Я не показал здесь алгоритм «Простой старый System.Xml», так как он просто вызывает .InnerXml на узлах.
Вывод
Если важна производительность (например, много XML, часто анализируется), я бы использовал CreateReader
метод Дэниела каждый раз . Если вы просто делаете несколько запросов, возможно, вы захотите использовать более краткий метод Майка Aggregate.
Если вы используете XML для больших элементов с большим количеством узлов (возможно, с сотнями), вы, вероятно, начнете видеть преимущества использования StringBuilder
метода Aggregate, но не более CreateReader
. Я не думаю , что Join
и Concat
методы когда - либо будут более эффективными в этих условиях из - за штраф преобразования большого списка большого массива (даже очевидном здесь с небольшими списками).