.Net发布版本比调试版本运行速度慢

6
我是一个有用的助手,可以为您进行翻译。以下是需要翻译的内容:

在过去几天中,我遇到了一件奇怪的事情。我发现我的发布版本实际上比调试版本执行速度更慢。

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. 结果
在调试模式下,我的经过时间大约为 200ms,在发布模式下需要大约 1.2s。
3. 其他信息
奇怪的是,当我尝试将该解决方案中的其他项目设置为启动项目时,因为在这种情况下它可以快速工作(与上述完全相同的代码)。
4. 快速 hack
为了尽快修复这个 bug,我在我的解决方案中创建了一个新的 .exe 启动项目,通过引用我的第一个入口项目来实例化和运行主应用程序表单。在这种情况下,它再次快速工作,我的入口 exe 现在只有 24kb 大小,只包含一个静态的 Main 方法。
有人遇到过类似的行为吗?如果我在其他地方遇到这个问题,通过查看上面的代码,我可能会认为存在一个静态初始化程序,在单独的线程中执行大量工作(但这里并非如此),而且仅在 Release 构建中运行?
[编辑] 更多信息:我知道 XmlSerializer 在运行时生成 IL 代码,但我的实际问题是为什么它在这种情况下比其他情况慢。当我只对实际序列化进行基准测试时,在 Release 中速度要慢 3 倍(但只有在我从初始项目运行它时)。
[更新] 现在是最奇怪的部分:经过几个修改/重建步骤后,我的新入口项目开始像第一个项目一样表现缓慢 - 启动缓慢,加载缓慢。我更改了项目名称和 GUID 并重新构建了它,现在它又快速工作了。

请注意,XmlSerializer在运行时生成一个类来处理实际的序列化。它会产生C#代码并在运行时编译。 - Dave Van den Eynde
我理解这一点,但我不明白为什么我的发布exe应用程序总是比较慢。此外,我可以实例化XmlSerializer,例如休眠10秒,然后进行1000次实际序列化以进行基准测试 - 在发布版本中始终比较慢。 - vgru
1个回答

6
我认为可能是因为XmlSerializer在Release模式下会在启动时进行NGEN-ish工作,但在Debug模式下不会。请参见此处获取更多详细信息。

谢谢,实际上我使用SGEN在发布模式下生成序列化程序集,但仍然很慢。如果我首先创建序列化程序,然后只基准测试序列化本身,它甚至会更慢。(顺便说一下,你的链接显示这个在mozilla中:“网站www.topxml.com已被报告为攻击网站”) - vgru
是的,收到了相同的警告。此外,谷歌也对这个网站发出了警告:http://www.google.de/search?hl=de&q=site%3Awww.topxml.com - Dirk Vollmar
谢谢,我已经修复了URL链接,指向原始的MSDN博客。 - Brian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接