在过去的几天里,我遇到了一个奇怪的事情.我发现我的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());
}
Run Code Online (Sandbox Code Playgroud)
所以我实际上不再实例化任何表单,只测试.TestClass是一个只有三个公共int财产的小班,没有别的.我的主要.exe(Windows窗体)是〜1Mb大,如果这有任何区别.
2.结果
在调试模式下,我的经过时间约为200毫秒,而在发布时则需要约1.2秒.
3.其他信息
奇怪的是当我尝试在该解决方案中设置一些其他项目作为启动项目时,因为在这种情况下它工作得很快(与上面完全相同的代码).
快速破解
为了尽快修复这个错误,我在我的解决方案中创建了一个新的.exe Startup项目,它通过引用我的第一个入口项目来实例化并运行主Application表单.在这种情况下,它再次快速工作,我的入口exe现在只有24kb大,只包含一个静态Main方法.
有没有人遇到过类似的行为?如果我在其他地方偶然发现了这个,通过查看上面的代码,我可能会假设某个地方有一个静态初始化程序,在一个单独的线程中做大量的工作(但这不是这里的情况,我没有那个东西),而且只在Release版本中运行?
[编辑]更多信息:我知道XmlSerializer在运行时生成IL代码,但我的实际问题是在这种情况下它比其他情况下运行速度慢的原因.当我仅对实际序列化进行基准测试时,它在Release中慢了3倍(但只有当我从我的初始项目中运行它时).
[更新]现在对于最奇怪的部分:经过几次修改/重建步骤后,我的新入口项目开始表现为第一个 - 慢启动,慢加载.我更改了项目名称和GUID并重新构建它,并且它再次快速运行.