ClickOnce已部署.Net 4.5 WPF应用程序。测试在Windows 7和Windows 7上运行。 Windows Server 2008 R2。内存/ CPU / IO(写入本地数据库)密集过程在2台测试机上需要8分钟,在其他每台机器上需要1小时(两台“快速”机器都是旧版Windows 7机器)。虚拟/物理,32/64位没有区别;其中一个“快速”机器是32位,另一个是64位(两者都有相同的内存和处理器规格,但其中一台“慢”机器也是如此)。 32位机器实际上运行得更快。较新的64位Windows 7机器具有3倍的内存和更快的处理器,核心比“快速”32位机器更多记录了一些最慢的时间。
进程的每个部分(创建大量对象,将插入语句发送到本地数据库等)在“慢”机器上花费的时间更长。 IOW,它不是IO与CPU。
快速:
- 32位,4GB RAM,2X4核心触发
- 64位,4GB RAM,2X4核心触发
慢:
- 32位,4GB RAM,2X4核心触发(唯一真正的区别,例如,不同的硬盘制造商之间的这一个和上面的快速之一是这台机器的L2缓存是快速的两倍)
- 64位,12GB内存,2X6触发(使用这些规格测试多台机器,测试接近最慢)
- 64位,4GB RAM,1X2核心proc(虚拟)
- 64位,8GB RAM,2X2核心触发(Server 2008 R2具有更快的SCSI驱动器)
我们这里有一台32位机器,几乎与“快速”32位机器完全相同。唯一真正的区别(除了例如不同的硬盘驱动器制造商之外)是“慢速”机器具有两倍于“快速”机器人的L2高速缓存。那台“慢”的机器需要一个多小时。因此,似乎确定它不是硬件问题。
它似乎也不是其他一些运行过程的问题;我看过的事情:
- Machine.config:从“快速”机器复制到“慢速”。没有区别。
- 硬盘加密:某些计算机启用了硬盘加密,有些则没有。其中一台“快速”机器缺少加密功能,但有些机器有加密功能。
- 实时病毒防护:大多数机器都在运行(包括“最快”的机器和一些最慢的机器。)
- 该过程不依赖于网络;整个过程都是本地的。
- 页面文件设置:“最快”和“最慢”之间的重复设置。
- 处理器负载平衡:查看处理器负载平衡(仅通过查看任务管理器)。没有明显的区别。
- 构建平台目标:制作一个只考虑X64的构建思路,使64位机器运行得更快(也许它们在WOW64上运行应用程序?)。没有不同。使用ManifestModule.GetPEKind验证了内置exe的区别。
- 比较名为“OnlineAppQuotaUsageEstimate”的ClickOnce相关值的注册表设置差异。 “慢速”机器上缺少这个值,但是当我将它添加到“快速”机器下存在的键下时,没有任何区别。似乎在任何情况下都不相关。
- Service Pack / patches:这里的一切都一样。
- Ran NP Profiler。 “慢”和“快”机器之间的区别:“快速”机器需要更长的时间来运行没有那么多工作的线程,但是运行重型起重线程的时间更少。没有单一的线程/方法作为罪魁祸首。我注意到的一件事是文件中的日志条目在慢速机器上需要可测量的时间,但在快速机器上没有可测量的时间。这导致我仔细检查硬盘驱动器和缓存,但除了上面提到的L2差异之外没有区别(较慢的机器有两倍的缓存速度)。
- [edit]创建了一个小型控制台应用程序,它可以执行一些类似的操作(字符串/列表操作以及写入本地数据库)。相同的比例结果。
所有迹象都表明2“快速”机器上有一些窗口配置与“慢”机器不同。寻找有关差异的建议;我认为没有任何工具可以指向2台不同的机器并显示出差异。我看不出注册表出口差异;它们将有500K。