2014-04-02 89 views
1

我必須在反序列化之前解析XML文檔。重複使用解析結果(通過創建讀取器)還是沒有性能差異是否有意義?C#XML反序列化 - 性能問題

var root = XDocument.Parse(message).Root; 
var type = mes3.Name.LocalName; 
if (type == typeOf(SomeType)) 
{ 
    var reader = root.CreateReader(); 
    var serializer = new XmlSerializer(typeof(SomeType)); 
    var someType = serializer.Deserialize(reader); 
} 
+2

只有這樣,才能回答正確的是火候。 –

回答

1

最好是重用通過創建讀取器來解析結果,而不是直接使用字符串消息進行反序列化,因爲字符串不會被再次解析在deserilization期間。

如果我們用一個快速和骯髒的演示程序:

using System; 
using System.Text; 
using System.Xml.Serialization; 
using System.IO; 
using System.Xml.Linq; 
using System.Diagnostics; 

namespace Sample_04_03_2014_01 
{ 
    public class Sample 
    { 
     public string Name { get; set; } 
    } 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Sample s = new Sample(); 
      s.Name = "Hello"; 
      var serializer = new XmlSerializer(typeof(Sample)); 
      var sb = new StringBuilder(); 
      using (var sw = new StringWriter(sb)) 
      { 
       serializer.Serialize(sw, s); 
      } 
      string serialized = sb.ToString(); 
      Console.WriteLine(serialized); 

      var root = XDocument.Parse(serialized).Root; 
      Sample someType1 = null; 
      Stopwatch stopWatch1 = new Stopwatch(); 
      stopWatch1.Start(); 
      for (int i = 0; i < 100000; i++) 
      { 
       var serializer1 = new XmlSerializer(typeof(Sample)); 
       using (var reader = root.CreateReader()) 
       { 
        someType1 = (Sample)serializer1.Deserialize(reader); 
       } 
      } 
      stopWatch1.Stop(); 
      Console.WriteLine(someType1.Name); 
      Console.WriteLine(stopWatch1.Elapsed); 

      Sample someType2 = null; 
      Stopwatch stopWatch2 = new Stopwatch(); 
      stopWatch2.Start(); 
      for (int i = 0; i < 100000; i++) 
      { 
       var serializer2 = new XmlSerializer(typeof(Sample)); 
       using (TextReader reader = new StringReader(serialized)) 
       { 
        someType2 = (Sample)serializer2.Deserialize(reader); 
       } 
      } 
      stopWatch2.Stop(); 
      Console.WriteLine(someType2.Name); 
      Console.WriteLine(stopWatch2.Elapsed); 
     } 
    } 
} 

然後我們得到〜對於第一種方法(CreateReader)30%的性能增益。

你好00:00:00.8825465你好00:00:01.2636450

0

你的代碼有相同的表現:

using (TextReader reader = new StringReader(message)) 
{ 
    result = serializer.Deserialize(reader); 
} 

由你有額外的對象.....

0

我用這個

using (FileStream xmlFile = new FileStream(filePath, FileMode.Open)) 
{ 
     resultclass = (resultclasstype)serializer.Deserialize(xmlFile); 
}