2009-04-21 25 views
5

我在過去的幾天裏遇到了最奇怪的事情。我發現我的Release版本實際上比Debug版本執行.Net發佈構建工作比調試慢

我終於在我的Windows刪除所有的東西從我的入口點(主要)問題窗體exe文件,只留下了這一點:

[STAThread] 
static void Main(params string[] args) 
{ 
    Stopwatch sw = Stopwatch.StartNew(); 
    System.Xml.Serialization.XmlSerializer xmlS = 
     new System.Xml.Serialization.XmlSerializer(typeof(TestClass)); 
    sw.Stop(); 
    MessageBox.Show(sw.Elapsed.ToString()); 
} 

所以,我其實並沒有任何實例形式了,只有測試。 TestClass是一個小類,只有三個公共int屬性,沒有別的。我的主要.exe(Windows窗體)是大約1Mb,如果這有什麼區別。

2.結果

在調試模式下,我經過時間是200毫秒〜,而在釋放它大約需要1.2秒。

3.附加信息

奇怪的是,當我嘗試設置一些其他的項目,該解決方案作爲啓動項目,因爲在這種情況下,它的工作原理(如上完全相同的代碼)快。

4.快速劈

要儘快修復這個bug,我在溶液中,實例化和引用我的第一個條目項目運行的主要申請表格創建一個新的.exe文件啓動項目。在這種情況下,它再次運行得很快,我的入門exe現在只有24kb大,只包含一個靜態Main方法。

有沒有人遇到過類似的行爲?如果我在其他地方偶然發現了這個問題,通過查看上面的代碼,我可能會推測在某個地方存在一個靜態初始化器,在單獨的線程中執行大量工作(但在這裏並不是這樣,我沒有東西),並進一步只在發佈版本中運行?我知道XmlSerializer在運行時生成IL代碼,但我的實際問題是爲什麼它在這種情況下比其他情況下更慢。當我僅對實際序列化進行基準測試時,它的發佈速度比發佈速度慢3倍(但僅限於我從最初的項目運行時)。

現在是最古怪的部分:經過幾次修改/重建步驟後,我的新入門項目開始表現爲第一個 - 慢啓動,慢加載。我更改了項目名稱和GUID並重建了它,並且它再次運行得很快。

+0

不要認爲XmlSerializer在運行時生成一個類來處理實際的序列化。它生成C#代碼並在運行時編譯它。 – 2009-04-21 09:13:03

+0

我明白,但我不明白爲什麼它在我的Release exe應用程序中總是比較慢。此外,我可以實例化XmlSerializer,例如休眠10秒,然後執行實際的序列化1000計時器進行基準測試 - 並且在Release中它總是比較慢。 – Groo 2009-04-21 09:32:55

回答

相關問題