【问题标题】:.Net Release build working slower than Debug.Net Release 构建工作比 Debug 慢
【发布时间】:2009-04-21 18:54:50
【问题描述】:

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

1.问题

我终于在我的 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。结果

在 Debug 模式下,我的 Elapsed time 大约是 200 毫秒,而在 Release 中大约需要 1.2 秒。

3.附加信息

奇怪的是,当我尝试在该解决方案中将其他项目设置为启动项目时,因为在这种情况下它运行得很快(与上面的代码完全相同)。

4.快速破解

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

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

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

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

【问题讨论】:

  • 请考虑 XmlSerializer 在运行时生成一个类来处理实际的序列化。它生成 C# 代码并在运行时对其进行编译。
  • 我明白这一点,但我不明白为什么我的 Release exe 应用程序总是变慢。此外,我可以实例化 XmlSerializer,例如休眠 10 秒,然后执行实际的序列化 1000 计时器以进行基准测试 - 而且在发布时它总是较慢。

标签: c# .net xml-serialization


【解决方案1】:

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

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

了解一些细节。

【讨论】:

  • 谢谢,我其实是用SGEN在Release模式下生成序列化程序集的,不过还是比较慢。当我先创建一个序列化程序然后只对序列化本身进行基准测试时,它甚至更慢。 (顺便说一句,您的链接在 mozilla 中显示:“www.topxml.com 上的网站已被报告为攻击站点”)
  • 是的,收到同样的警告。谷歌也警告这个网站:google.de/search?hl=de&q=site%3Awww.topxml.com
  • 谢谢,我把原来的msdn博客的网址改好了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-16
  • 2021-06-09
  • 2020-03-18
  • 2022-06-20
  • 2017-06-14
相关资源
最近更新 更多