.Net Release构建工作比Debug慢

时间:2009-04-21 09:04:55

标签: c# .net xml-serialization

在过去的几天里,我遇到了一件奇怪的事情。我发现我的Release版本实际上比Debug版本执行

1。问题

我终于从我的Windows Forms exe中的入口点(Main)中删除了所有内容,只剩下这个:

 [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。快速破解

为了尽快修复此错误,我在我的解决方案中创建了一个新的.exe启动项目,它通过引用我的第一个入口项目来实例化并运行主应用程序表单。在这种情况下,它再次快速工作,我的入口exe现在只有24kb大,只包含一个静态Main方法。

有没有人遇到过类似的行为?如果我在其他地方偶然发现了这个,通过查看上面的代码,我可能会假设某个地方有一个静态初始化程序,在一个单独的线程中做大量的工作(但这不是这里的情况,我没有那个东西),还只在Release build中运行?

[编辑] 更多信息:我知道XmlSerializer在运行时生成IL代码,但我的实际问题是在这种情况下它比其他情况下运行速度慢的原因。当我仅对实际序列化进行基准测试时,它在Release中慢了3倍(但只有当我从初始项目中运行它时)。

[更新] 现在对于最奇怪的部分:经过几次修改/重建步骤后,我的新项目开始表现为第一个 - 慢启动,慢加载。我更改了项目名称和GUID并重新构建它,并且它再次快速运行。

1 个答案:

答案 0 :(得分:6)

我想这可能是因为XmlSerializer在发布模式下启动时NGEN-ish工作,但在调试模式下不工作。参见例如

http://blogs.msdn.com/billwert/archive/2008/02/23/use-of-sgen-exe-to-avoid-common-xmlserializer-performance-pitfalls.aspx

了解一些细节。