>  기사  >  백엔드 개발  >  XML 데이터 읽기 방법의 성능 비교(1)

XML 데이터 읽기 방법의 성능 비교(1)

黄舟
黄舟원래의
2017-02-13 15:43:581472검색

지난 몇 달 동안 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)를 참고해주세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.