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

时间:2015-05-09 09:51:53

标签: c# winforms performance x86 64-bit

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

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

所以我开始想知道造成它的原因。我的程序使用了很多小部件,所以为了测试理论,我决定用800个按钮创建一个测试项目!我将所有这些设置为Visible=False,以便重绘/刷新速度不会使水变得混乱。

Sample form with 800 buttons

令我惊讶的是,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

1 个答案:

答案 0 :(得分:6)

这是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打交道的缺点。