我们正在开发Winforms应用程序并在优化启动时间的过程中。
该应用程序在64位Vista计算机上运行。在我们的测试中,我们发现了一个看似反直觉的结果。所有其他方面都相同,在一半的时间内针对32位与64位负载。任何人都可以解释为什么?
感谢。
[编辑] 我们通过ClickOnce部署应用程序,我们的研究从一个独特的沙箱中启动应用程序。因此,它总是冷启动,所以在这里寻求提高性能是徒劳的。
我们的主要问题是项目中存在32位dll。一旦我们在x86上定位项目(即使它在x64上运行),加载时间减少了一半。 [/编辑]
答案 0 :(得分:5)
.NET 3.5 SP1通过不再验证来自受信任位置的程序集的强名称来获得其改进的启动性。我的书中有点争议,但有些可辩解。
我确实检查了64位版本的CLR是否也绕过了这个耗时的步骤。签名一个DLL,把它放在GAC中,然后修补一个字节。装载组件时没有抱怨。因此,SP1启动pref改进不是解释差异的原因。
启动时间的其他因素有: - 从磁盘加载CLR(仅限冷启动) - 为依赖程序集进行Groveling - JIT编译启动代码
Coldstart很可能是一个因素,你可能没有运行其他进程加载了64位版本的CLR。在进行测试时,通过运行虚拟.NET应用程序可以轻松消除。
由于同样的原因,Groveling程序集可能需要更长的时间。 .NET程序集的64位ngen-ed映像不太可能位于文件系统缓存中。同样,使用虚拟应用程序依赖于相同的程序集很容易消除。
64位JITter是一个难以破解的坚果。一个任意的调用是假设MSFT没有花费那么多时间来使那个性能与32位JITter一样多。没有任何证据支持任何证据。很难测量,你已经用Assembly.Load加载了一个程序集,然后是时间Activator.CreateInstance(),其中类构造函数调用尽可能多的代码。
答案 1 :(得分:2)
64位版本通常会在堆上使用两倍的内存:每个指针占用两倍的空间,而.NET则充满了指针。由于启动受到内存初始化的严重影响,这可能会占用额外开销的一部分。另请参阅Donald Knuth's flame about 64-bit pointers。
答案 2 :(得分:1)
请注意,根据Microsoft的说法,.Net 3.5 SP1在启动性能方面做了相当多的工作(对于某些应用程序,性能提高了40%),因此您可能会看到它是否也有帮助。