c# – 相对于x86,在x64下启动Winforms程序10倍

我在C#中创建了一个流行的 Winforms程序,它有很多GUI小部件,并且发现当平台目标是x64时,启动速度比x86慢大约5-10倍.在x64目标下,启动大约需要5秒钟,这会对用户体验产生负面影响.我想更快点.

我也尝试过我的另一个程序,并且发现x64下的启动时间是x86的两倍或三倍.

所以我开始怀疑是什么导致了它.我的程序使用了很多小部件,所以为了测试理论,我决定用800个按钮创建一个测试项目!我将它们全部设置为Visible = False,以便重绘/刷新速度不会使水变得混乱.

令我惊讶的是,x64的启动速度比x86相当慢.然后我继续计时InitializeComponent();部分,果然,x64版本在大约3.5秒内运行.另一方面,x86只用了大约0.275秒.这快了近13倍!

.NET Framework 2.0,3.0和3.5同样糟糕.针对.NET 4& x64下的4.5在0.8秒左右会好得多,但这仍然是慢3倍(x86大约差0.28秒),我想使用.NET 3.5来增加用户群.

所以我的问题是:是什么导致x64版本启动速度如此之慢,如何让它更快,以便它可以与x86版本相媲美?

如果有人想立即测试,我已经创建了VS 2010项目的zip,可以在这里下载:http://www.skytopia.com/stuff/64_vs_32bit_Startup_Speed.zip

解决方法

这是10000行InitializeComponent函数的JIT成本.

>如果您测量调用InitializeComponent和执行第一行之间的时间,那么这是成本的主要部分. (只需在InitializeComponent的顶部插入一行进行测量.)
>如果您使用VS Performance Analyzer,它将显示花在ThePreStub上的大部分时间,这与JIT有关.
> 64位JITter编译代码的时间比32位JITter长,但作为交换,它会产生更好的代码.

微软正在开发名为RyuJIT的新版JITter.它源自32位JITter并具有类似的特性(快速编译输出更差的代码).它将成为.NET未来版本中的标准JIT.
> .NET 4.5在我的机器上将成本从2.0秒降低到1.3.这可能是由于4.0运行时中的JIT改进.
>等效循环比InitializeComponent函数快得多.

如果您想在设计器中创建所有组件,这对您没有帮助,但如果您想在设计器中编辑重复控件和组件,则可以使用循环.只需将它放在Form1.cs中而不是Form1.designer.cs中,这样它就不会被设计者覆盖.>在装配体上使用NGen应该可以消除JIT成本.但它伴随着与GAC打交道的缺点.

相关文章

文章浏览阅读6.2k次,点赞2次,收藏3次。C#数学运算表达式解...
文章浏览阅读5.2k次,点赞6次,收藏7次。程序要做到用户配置...
文章浏览阅读9k次。错误信息检测到 ContextSwitchDeadlock M...
文章浏览阅读2w次,点赞10次,收藏9次。我发生错误时的环境:...
文章浏览阅读9.8k次。C# 二进制字节流查找函数IndexOf ...
文章浏览阅读2.5w次,点赞3次,收藏9次。c#DataGridView数据...