집 >백엔드 개발 >XML/RSS 튜토리얼 >XML 데이터 읽기 방법의 성능 비교(1)
지난 몇 달 동안 SOA로 인해 xml 작업만 다루다보니 SQL에 대한 내용은 거의 잊어버렸습니다. 현재 일반적으로 사용되는 XML 데이터 조작 방법(Java와 유사)이 적어도 4가지 이상 있는 것으로 알려져 있지만, 이러한 각 방법의 특징, 장단점을 실제로 비교한 적은 없습니다. 우연히 인터넷에서 이 분야에 대한 실험이 없는 것을 보고 요약해보겠습니다.
테스트 시작 시 XML 소스를 읽고 비교적 큰 RSS 파일 링크를 사용하여 프로젝트 bin/debug 디렉터리에 복사합니다.
Stream xmlStream = new MemoryStream(File.ReadAllBytes(path));
1. XmlDocument 메서드
코드
1 static IList testXmlDocument() 2 { 3 var doc = new XmlDocument(); 4 doc.Load(xmlStream); 5 var nodeList = doc.DocumentElement.ChildNodes; 6 var lstChannel = new List<Object>(nodeList.Count ); 7 foreach (XmlNode node in nodeList) 8 { 9 var channel = new 10 { 11 Title = node.SelectSingleNode("title").InnerText, 12 Link = node.SelectSingleNode("link").InnerText, 13 Description = node.SelectSingleNode("description").InnerText, 14 Content = node.SelectSingleNode("content").InnerText, 15 PubDate = node.SelectSingleNode("pubDate").InnerText, 16 Author = node.SelectSingleNode("author").InnerText, 17 Category = node.SelectSingleNode("category").InnerText 18 }; 19 lstChannel.Add(channel); 20 } 21 return lstChannel; 22 }
2. XPathNavigator 메서드
코드
1 static IList testXmlNavigator() 2 { 3 var doc = new XmlDocument(); 4 doc.Load(xmlStream); 5 var nav = doc.CreateNavigator(); 6 nav.MoveToRoot(); 7 var nodeList = nav.Select("/channel/item"); 8 var lstChannel = new List<Object>(nodeList.Count); 9 foreach (XPathNavigator node in nodeList) 10 { 11 var channel = new 12 { 13 Title = node.SelectSingleNode("title").Value, 14 Link = node.SelectSingleNode("link").Value, 15 Description = node.SelectSingleNode("description").Value, 16 Content = node.SelectSingleNode("content").Value, 17 PubDate = node.SelectSingleNode("pubDate").Value, 18 Author = node.SelectSingleNode("author").Value, 19 Category = node.SelectSingleNode("category").Value 20 }; 21 lstChannel.Add(channel); 22 } 23 return lstChannel; 24 }
3. XmlTextReader 메서드
코드
1 static List<Channel> testXmlReader() 2 { 3 var lstChannel = new List<Channel>(); 4 var reader = XmlReader.Create(xmlStream); 5 while (reader.Read()) 6 { 7 if (reader.Name == "item" && reader.NodeType == XmlNodeType.Element) 8 { 9 var channel = new Channel(); 10 lstChannel.Add(channel); 11 while (reader.Read()) 12 { 13 if (reader.Name == "item") break; 14 if (reader.NodeType != XmlNodeType.Element) continue; 15 switch (reader.Name) 16 { 17 case "title": 18 channel.Title = reader.ReadString(); 19 break; 20 case "link": 21 channel.Link = reader.ReadString(); 22 break; 23 case "description": 24 channel.Description = reader.ReadString(); 25 break; 26 case "content": 27 channel.Content = reader.ReadString(); 28 break; 29 case "pubDate": 30 channel.PubDate = reader.ReadString(); 31 break; 32 case "author": 33 channel.Author = reader.ReadString(); 34 break; 35 case "category": 36 channel.Category = reader.ReadString(); 37 break; 38 default: 39 break; 40 } 41 } 42 } 43 } 44 return lstChannel; 45 }
4. Linq to XML 메서드
코드
1 static IList testXmlLinq() 2 { 3 var xd = XDocument.Load(xmlStream); 4 var list = from node in xd.Elements("channel").Descendants("item") 5 select new 6 { 7 Title = node.Element("title").Value, 8 Link = node.Element("link").Value, 9 Description = node.Element("description").Value, 10 Content = node.Element("content").Value, 11 PubDate = node.Element("pubDate").Value, 12 Author = node.Element("author").Value, 13 Category = node.Element("category").Value 14 }; 15 return list.ToList(); 16 }
테스트 결과:
XmlDocment 47ms XPathNavigator 42ms XmlTextReader 23ms Xml Linq 28ms
제가 이해한 것을 정리하자면, XmlDocument의 동작은 기본적으로 W3C DOM의 동작 방식을 따르지만, 모든 노드는 객체로 파싱되어 메모리에 로드되는데, 이로 인해 많은 낭비가 발생하는 경우가 많습니다. 따라서 Microsoft 자체 프로그래밍 표준에서는 해당 사용을 권장하지 않습니다. 여기에서는 모든 노드를 읽어오기 때문에 성능은 Navigator 방식과 크게 다르지 않을 수 있습니다. 세 가지 임의 읽기 방법 중 Xml Linq가 성능이 가장 좋은데, 방법 이름이 좀 어색합니다. XmlTextReader 메서드는 소위 SAX로 읽기 전용이며 성능이 가장 좋지만, 액세스 논리를 보다 정확하게 제어해야 하고 익명 클래스를 사용하여 저장할 수 없습니다. 데이터.
.Net 3.5 릴리스 Xml Linq는 처음 두 가지 방법을 매우 잘 대체할 수 있으므로 일반적인 상황에서는 이를 사용하는 것이 가장 좋습니다. 성능 요구 사항이 매우 높거나 읽을 Xml 데이터의 양이 너무 커서 한 번에 다운로드하거나 메모리에 읽을 수 없는 경우에만 XmlTextReader에 커밋해야 합니다.
위는 XML 데이터 읽기 방식의 성능 비교입니다(1). 더 많은 관련 내용은 PHP 중국어 홈페이지(www.php.cn)를 참고해주세요!