[英]Startup of Winforms program 10x slower under x64 relative to x86
我在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同样糟糕。 在x64下针对.NET 4和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打交道的缺点。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.