제안 된 솔루션 중 어떤 것이 가장 잘 수행되는지 확인하고 싶었 기 때문에 비교 테스트를 수행했습니다. 관심이 없으면 LINQ 메서드를 Greg가 제안한 일반 구형 System.Xml 메서드 와 비교했습니다 . 가장 느린 방법 은 가장 빠른 방법 보다 3 배 이상 느린 변형이 흥미롭고 예상했던 것과 다릅니다. .
결과는 가장 빠르거나 느리게 정렬됩니다.
- CreateReader-인스턴스 헌터 (0.113 초)
- 평범한 오래된 System.Xml-Greg Hurlman (0.134 초)
- 문자열 연결로 집계-Mike Powell (0.324 초)
- StringBuilder-Vin (0.333 초)
- String.Join on array-Terry (0.360 초)
- 배열의 문자열-Marcin Kosieradzki (0.364)
방법
20 개의 동일한 노드 ( '힌트'라고 함)가있는 단일 XML 문서를 사용했습니다.
<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>
위의 초로 표시된 숫자는 20 개 노드의 "내부 XML"을 1000 회 연속으로 추출하여 평균 (평균) 5 회 실행 한 결과입니다. XML을로드하고 XmlDocument
( System.Xml 메서드의 경우) 구문 분석하는 데 걸리는 시간은 포함하지 않았습니다.XDocument
(다른 모든 것의 경우 .
내가 사용한 LINQ 알고리즘은 다음과 같습니다. (C #-모두 XElement
"부모"를 취하고 내부 XML 문자열을 반환합니다)
리더 만들기 :
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());
노드에서 .InnerXml을 호출하기 때문에 여기에 "Plain old System.Xml"알고리즘을 표시하지 않았습니다.
결론
성능이 중요한 경우 (예 : 많은 XML, 자주 구문 분석) 매번 Daniel의 CreateReader
방법을 사용 합니다 . 몇 가지 쿼리를 수행하는 경우 Mike의 더 간결한 집계 방법을 사용할 수 있습니다.
많은 노드 (아마도 100)가있는 큰 요소에서 XML을 사용하는 경우 아마도 StringBuilder
Aggregate 메서드 를 사용하는 것의 이점을 볼 수 있지만 over는 아닙니다 CreateReader
. 큰 목록을 큰 배열로 변환하는 것에 대한 패널티 (여기서는 작은 목록에서는 명백 함)로 인해 이러한 조건에서 Join
및 Concat
메소드가 더 효율적 이라고 생각하지 않습니다 .