我正在經歷一個真正的巨大的性能損失,同時調用一個簡單的XmlSerializer.Deserizlize()有很多字段的類。XmlSerializer啓動在64位系統上巨大的性能損失
注意:我在家裏編寫沒有Visual Studio的代碼,所以它可能有一些錯誤。
我的序列化的類是平坦的並且有數百字段:
[Serializable]
class Foo
{
public Foo() { }
[XmlElement(ElementName = "Field1")]
public string Field1;
// [...] 500 Fields defined in the same way
[XmlElement(ElementName = "Field500")]
public string Field500;
}
我的申請反序列化輸入字符串(即使小):
StringReader sr = new StringReader(@"<Foo><Field1>foo</Field1></Foo>");
XmlSerializer serializer = new XmlSerializer(typeof(Foo));
object o = serializer.Deserialize(sr);
運行在32位系統中的應用程序(或與32位強制執行corflags.exe),代碼大約需要ONE SECOND(臨時序列化類生成,全部...),那麼它接近於0.
運行在64位系統中的應用,代碼需要一分鐘第一次,那麼它的接近0
怎麼可能會導致系統掛起這麼長的時間,在第一次執行時一個XmlSerializer,用於64位系統中的大類?
現在我不知道如果我要責怪臨時類生成/刪除,XML名稱表初始化,CAS,Windows搜索,防病毒或聖誕老人...
破壞者
這裏是我的測試,如果你不想被我的(可能的)分析錯誤所束縛,請不要閱讀本文。
- 運行代碼的從Visual Studio調試器使得即使在64個的系統
- 添加(完全未記錄的)system.diagnostic開關「XmlSerialization.Compile」,這防止了系統從除去FAST運行代碼序列化臨時類,使代碼在64位系統中運行FAST
- 以運行時創建的臨時FooXmlSerializer類(包括項目中的.cs),並使用它代替XmlSerializer,即使在代碼中也可以運行FAST 64位系統
- 使用sgen.exe創建相同的FooXmlSerializer類,包括.cs在我的項目中,並使用它代替XmlSerializer,即使在64位系統中也能使代碼運行FAST
- 使用sgen.exe創建相同的FooXmlSerializer類,並引用Foo.XmlSerializers。dll程序集,並使用它代替XmlSerializer,即使在64位系統中也能使代碼運行SLOW(,這使我非常困難)
- 僅當反序列化的輸入實際上包含字段時纔會發生性能損失大班的(這也來煩我了很多)
爲了進一步解釋最後一點,如果我有一個類:
[Serializable]
class Bar
{
public Bar() { }
[XmlElement(ElementName = "Foo")]
public Foo Foo; // my class with 500 fields
}
傳遞一個富孩子,只有當反序列化是緩慢的。即使我已經進行了反序列化:
StringReader sr = new StringReader(@"<Bar></Bar>");
XmlSerializer serializer = new XmlSerializer(typeof(Bar));
object o = serializer.Deserialize(sr); // FAST
StringReader sr = new StringReader(@"<Bar><Foo><Field1>foo</Field1></Foo></Bar>");
XmlSerializer serializer = new XmlSerializer(typeof(Bar));
object o = serializer.Deserialize(sr); // SLOW
編輯我忘了說,我分析了進程監視器執行,我沒有看到任何任務花費很長的時間,從我的應用程序或CSC。 exe或任何與框架有關的東西。該系統只是做其他的東西(或者我失去了一些東西),如防病毒,explorer.exe的,Windows搜索索引(已試圖將其關閉)
sgen有什麼問題?爲什麼不只想走這條路嗎? – 2010-11-09 19:39:55
我的Foo()類,調用XmlDeserializer的代碼是由舊系統動態生成的,我不能重構太多,我已經有了一個可接受的解決方案(使用system.diagnostic開關設置),但我真的很想知道什麼掛在系統:) – Filini 2010-11-09 19:54:00
因此,你的系統不是很忙,它只是坐在那裏?這種表示某種類型的超時,可能試圖解決一個XML架構或什麼。不過,我預計在32位和64位環境中都會出現相同的延遲,除非先前以32位模式緩存模式,否則someh流。請重新輸入。 。 。 – TMN 2010-11-09 20:11:18