我们有用VB .NET 4.0 / VS2010编写的.NET应用程序,编译时所有项目都设置为调试和发布配置的AnyCPU设置。
所有其他应用程序在64位上都更快,但我们可怜的应用程序除外;) (我们确实在不同的时间、不同的负载下测试了这些应用程序,结果总是大同小异。)
如上所述,该应用程序是使用AnyCPU构建的,它确实在64位操作系统(通过TaskManager检查)下作为64位程序集运行。该应用程序本身是一个WinForms应用程序,使用NetAdvantage Forms v10.3,并定期查询和写入MS SQL Server2008。
不同的目标机器都在同一网络上,因此到数据库的路径(性能测试使用的是同一数据库)是相同的,我不认为问题出在数据库或网络本身。
我确实注意到了一件事,这对我来说似乎很奇怪,那就是当我在MainForm启动时使用秒表构建不同的“分析步骤”时,InitializeComponent方法在64位上花费的时间是64位的两倍,大约4秒,而在32位上只需要1.5秒。
这是我们在两个系统上部署的完全相同的应用程序,没有不同的配置。
所以我有两个问题:
你知道这是什么原因吗?
还有:确定“违规”代码片段的最佳方法是什么?目前,我使用秒表,并尝试缩小范围。但在我看来,就我们的应用程序而言,64位机器上的一切都要慢一些,所以我不太确定我能不能把它分解成具体的语句。
谢谢你的帮助,非常感谢……
发布于 2012-11-20 11:02:05
事实证明,一旦我们从AnyCPU转换到专门的x86编译,也就是在x64位平台上以x86运行,我们就回到了“好速度”。
发布于 2014-12-10 04:40:01
有同样的问题-是的,JIT是罪魁祸首。通过明智地使用msgbox,将其范围缩小到需要10秒才能启动的方法(在调用大型方法之前调用message box,然后作为大型函数的第一行)。而且,是的,只有在以AnyCPU身份编译时才会看到这一点,但在显式x86时不会看到;在调试中运行时也不会看到。
在我的例子中,它是一个5000行的Windows Forms InitializeComponent。
为了证明这一点,运行(提升的) "c:\windows\<.net framework dir>\ngen.exe install <myassembly.exe>“,它将编译一个本机映像。如果这解决了它,那么是的,JIT是罪魁祸首。
长期解决方案:
<System.Runtime.CompilerServices.MethodImpl(MethodImplOptions.NoOptimization)>添加到方法中,因为对于较大的applications.)(我怀疑这两种做法都是徒劳的,因为这将意味着放弃大方法的本机映像而一无所获。)
发布于 2014-03-01 01:15:02
我最近在一个应用程序中遇到了同样的性能问题。是的,将它编译为x86解决了这个问题;然后它在任一平台上都运行得很快。但启动响应时间缓慢的真正原因是由于32到64位的迁移问题。我认为,当应用程序启动时,它通过JIT过程将代码转换为IL,编译器确定代码中存在问题(如非类型安全代码),它必须解决这些问题才能在64位模式下运行。我偶然看到了这篇文章,现在正在尝试通过应用程序来确定是哪些部分导致了问题。请参阅本文:http://msdn.microsoft.com/en-us/library/ms973190.aspx。我可以让它单独运行,因为它可以工作,但理想情况下,如果问题得到解决,它将在64位模式下运行得更好。
https://stackoverflow.com/questions/12979774
复制相似问题