然而,在64位操作系统上报告了一个错误*,我的应用程序会出现错误,需要针对x86进行解决。
现在我的问题是:即使您的代码将在x64中运行,针对x86真的很糟糕吗?我们谈论什么样的性能?(我的应用程序需要大量使用CPU,但很难想出)
毕竟,.NET Framework将以32位运行,这听起来对我来说很糟糕,而不是利用x64 CPU的全部寻址能力**。
*我记不清楚错误是什么,但解决方案是特别针对x86,解决了问题。
**我不确定它是否有任何重要性,但我的应用程序不使用任何Int64变量。
然而,在64位操作系统上报告了一个错误*,我的应用程序会出现错误,需要针对x86进行解决。
现在我的问题是:即使您的代码将在x64中运行,针对x86真的很糟糕吗?我们谈论什么样的性能?(我的应用程序需要大量使用CPU,但很难想出)
毕竟,.NET Framework将以32位运行,这听起来对我来说很糟糕,而不是利用x64 CPU的全部寻址能力**。
*我记不清楚错误是什么,但解决方案是特别针对x86,解决了问题。
**我不确定它是否有任何重要性,但我的应用程序不使用任何Int64变量。
不,这并不是坏事;实际上,对于我正在开发的一个应用程序,我必须针对x86进行目标设置(因为它会引入COM对象,而供应商不支持x64)
我有一个非常计算密集型的应用程序,使用CPU很多(通过暴力破解某个解决方案)。在64位.NET Framework上运行(8秒)比32位(30秒)快大约4倍。不过这只是一个特例。
不必担心在x64系统上需要定位到x86。虽然你会错过额外的x64优势,最终运行在32位仿真层,但这比完全崩溃要好得多,大多数现有应用程序仍为32位。
在.Net中,需要这样做的常见原因是依赖于本地的32位dll。如果将你的.Net定位为任何CPU,它将尝试在64位模式下加载你的32位dll,导致崩溃。最终,你需要摆脱这种依赖关系,以便使用64位模式。但对于一个版本来说,这并不会致命。
如果您经常使用结构体,并且有很多64位计算(double,long),那么由于32位Jit引擎相对于64位引擎不够先进,您将看到性能下降。
否则,.Net的32位和64位版本在性能方面有些相似。
而且,如果您不需要超过2GB的进程限制,则不需要64位寻址能力,操作系统会使用称为Long Mode - Compatibility SubMode的特殊CPU模式为您处理。(实际上,CPU正在以64位模式运行,但出于兼容性考虑,使用32位进行寻址)
不会有问题。实际上,我们经常发现我们的 32 位应用程序在 64 位 Vista 上运行比在 32 位 Vista 上更好,由于较新的操作系统内存管理器。直接针对 x86 应该可以很好地工作。然而,能够在 64 位上本地运行将具有其他优点,如能够访问更多的内存,提供更多的 CPU 寄存器等,因此如果可能的话,值得投入努力来使其正常运行。
我原本想说最好的方法是测量,但显然如果它无法正常运行,那么测量就有点困难。
首先看看是否存在性能问题。 如果似乎存在问题,则请尝试确定在应用程序中何处不符合x64规范。 大多数.NET代码应该是平台无关的,因此最有可能的罪魁祸首是任何本机Interop或第三方库。
你的“bug”是不是因为你的.NET代码使用了32位的COM对象?
当在一个已经编译成AnyCPU设置的64位架构上运行.NET进程时,这种情况可能会成为一个问题。
原因是该进程将作为64位进程执行,任何在进程中执行的COM组件也必须是64位版本。如果不是这种情况,你的进程将退出。
一个可能的解决方案是将目标平台设置为x86。