从 .net 2.0 转换到 4.0 后对性能问题进行故障排除

Posted

技术标签:

【中文标题】从 .net 2.0 转换到 4.0 后对性能问题进行故障排除【英文标题】:troubleshooting a performance issue after converting from .net 2.0 to 4.0 【发布时间】:2012-01-31 11:17:55 【问题描述】:

我有一个 5 年历史的 winforms .net MDI 应用程序,我刚刚使用 vs 2010 从 .net 2.0 转换为 4.0...该应用程序现在需要大约 1.5 分钟才能启动并在 vs 之外启动时打开一个空白表单,在 vs. 内启动时大约需要 15 秒(在升级到 .net4.0 和 devexpress 11.2 之前,在任何一种情况下启动应用程序都没有明显的延迟)

不幸的是,这里的变量太多了...就像我们还必须使用新版本的 devexpress 控件库和 xpo 持久层 (orm)。

主窗体有大约 1500 个左右的控件,分布在 devexpress 选项卡控件的 12 个选项卡上。分析应用程序表明,在表单构造函数中,几乎 63% 的时间都花在“clr.dll”中......我现在知道如何解释它了。

作为测试,我使用相同的工具构建了另一个应用程序,并在一个空白表单上放置了 1500 个控件,结果表明该应用程序中不到 1% 的时间用于该表单构造函数的 clr.dll。

这对我来说感觉不对...任何人都可以理解这一点或指出正确的方向以继续了解所有时间的去向...

我已经准备好接受结果并说好......我们不能这样做,但事实上我可以创建另一个 devexpress 表单并在其上放置 1500 个控件,当我对其进行分析时,结果会产生更有意义的是,表单构造函数中的大部分时间都花在了 ControlsCollection.Add 函数或控件构造函数本身......

有什么想法吗?

谢谢乔纳森

好的...我打开了加载符号,这就是我现在得到的...我必须说这让我很担心,因为我在英特尔机器上运行...我也找不到关于 PreStubAmd64 的任何文档称呼。

【问题讨论】:

【参考方案1】:

嗯...我似乎已经解决了我自己的问题,但我并不完全理解。

因为我从 2008 年开始转换原始项目,所以 VS 2010 中的目标平台是“Any Cpu”......(这对我来说很有意义......)。我试图构建一个表现同样糟糕的新应用程序,我注意到我所有的新项目都默认为 x86 并且运行良好......所以......

在使用配置管理器并为我的针对 x86 的问题解决方案创建新配置后,我的启动时间从 90 秒变为 9 秒......而且我没有看到“theStubAMD64”功能占用的迹象就像我 80% 的时间都在实例化表单......哇哦......

因此,对于将 2008 格式转换为 2010 并需要在 x64 下运行的其他任何人,您可能希望将目标更改为 x86。 (我确定我错过了各种各样的东西......但我很高兴!)

乔纳森

我想没有人愿意解释为什么应用程序在 wow64 下比原生 64 位运行得更快...

【讨论】:

以上是关于从 .net 2.0 转换到 4.0 后对性能问题进行故障排除的主要内容,如果未能解决你的问题,请参考以下文章

ReflectionTypeLoadException 从 .Net 4.0 应用程序加载 .Net 4.0 程序集,而 2.0 可以工作

从 .NET 3.5 转换到 .NET 2.0

PInvoke在 2.0 3.0的时候正常 升级到4.0后出错。

如何从 Catel 项目迁移到 Orchestra + MahApps? (.NET 4.0)

Visual Studio 2010,TlbImp 在 2.0 项目中生成 .net 4.0 互操作

IIS 注册 ASP.NET 2.0 4.0