Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.Net 3.5 Windows窗体应用程序:64位Vista上的x86与x64加载时间_.net_Windows_Winforms_Windows Vista_64 Bit - Fatal编程技术网

.Net 3.5 Windows窗体应用程序:64位Vista上的x86与x64加载时间

.Net 3.5 Windows窗体应用程序:64位Vista上的x86与x64加载时间,.net,windows,winforms,windows-vista,64-bit,.net,Windows,Winforms,Windows Vista,64 Bit,我们正在开发Winforms应用程序,并正在优化启动时间 该应用程序在64位Vista机器上运行。在我们的测试中,我们发现了一个似乎违反直觉的结果。所有其他方面都相同,目标是32位与64位加载,时间缩短一半。有人能解释一下原因吗 谢谢 [编辑] 我们通过ClickOnce部署应用程序,根据我们的研究,ClickOnce在一个独特的沙箱中启动应用程序。因此,它总是冷启动,所以在这里寻求提高性能是徒劳的 我们的主要问题是项目中存在32位DLL。一旦我们将项目定位于x86(即使它在x64上运行),加载

我们正在开发Winforms应用程序,并正在优化启动时间

该应用程序在64位Vista机器上运行。在我们的测试中,我们发现了一个似乎违反直觉的结果。所有其他方面都相同,目标是32位与64位加载,时间缩短一半。有人能解释一下原因吗

谢谢

[编辑] 我们通过ClickOnce部署应用程序,根据我们的研究,ClickOnce在一个独特的沙箱中启动应用程序。因此,它总是冷启动,所以在这里寻求提高性能是徒劳的

我们的主要问题是项目中存在32位DLL。一旦我们将项目定位于x86(即使它在x64上运行),加载时间就减少了一半。
[/Edit]

64位版本通常会在堆上使用两倍的内存:每个指针占用两倍的空间,并且.NET中充满了指针。由于启动受到内存初始化的严重影响,这可能会导致额外开销的一部分。另请参阅。

请注意,根据Microsoft的说法,.Net 3.5 SP1在启动性能方面做了相当多的工作(某些应用程序的性能提高了40%),因此您可能会看到这是否也有帮助。

.Net 3.5 SP1通过不再验证来自受信任位置的程序集的强名称来提高启动性能。在我的书中有点争议,但有点站得住脚

我确实检查了64位版本的CLR是否也绕过了这个耗时的步骤。签署了一个DLL,将其放入GAC,然后修补了一个字节。加载组件时没有投诉。因此,解释差异的并不是SP1启动pref的改进

启动时间中的其他因素包括: -从磁盘加载CLR(仅限coldstart) -从属程序集的Grooving -JIT编译启动代码

Coldstart很可能是一个因素,您可能没有其他运行的进程加载了64位版本的CLR。在您进行测试时运行一个虚拟的.NET应用程序,很容易消除此问题

出于同样的原因,磨平装配可能需要更长的时间。.NET程序集的64位ngen ed映像不太可能在文件系统缓存中。同样,由于虚拟应用程序依赖于相同的程序集,因此很容易消除

64位抖动是一个更难解决的问题。一个任意的调用是假设MSFT没有花费与32位抖动一样多的时间来实现这个性能。但没有任何证据支持。也很难测量,您需要使用assembly.load加载程序集,然后使用time Activator.CreateInstance()加载程序集,其中类构造函数调用尽可能多的代码