【发布时间】: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