在64位操作系统上运行32位.NET应用程序,是否真的很糟糕?

6
我知道我们可以通过针对AnyCPU编译.NET应用程序,这将导致在32位操作系统中运行32位,在64位操作系统中运行64位。

然而,在64位操作系统上报告了一个错误*,我的应用程序会出现错误,需要针对x86进行解决。

现在我的问题是:即使您的代码将在x64中运行,针对x86真的很糟糕吗?我们谈论什么样的性能?(我的应用程序需要大量使用CPU,但很难想出)

毕竟,.NET Framework将以32位运行,这听起来对我来说很糟糕,而不是利用x64 CPU的全部寻址能力**。

*我记不清楚错误是什么,但解决方案是特别针对x86,解决了问题。

**我不确定它是否有任何重要性,但我的应用程序不使用任何Int64变量。

9个回答

4

不,这并不是坏事;实际上,对于我正在开发的一个应用程序,我必须针对x86进行目标设置(因为它会引入COM对象,而供应商不支持x64)


1
假设您将其作为进程运行,您可以从64位进程中运行32位COM。请参阅https://dev59.com/nUbRa4cB1Zd3GeqP3cS8。 - Zach
1
在我的情况下,是框架在 WIC 的深处处理互操作。曾考虑编写一个 out of proc 代理,但只针对 x86 目标更加轻松。 - Rowland Shaw

2

我有一个非常计算密集型的应用程序,使用CPU很多(通过暴力破解某个解决方案)。在64位.NET Framework上运行(8秒)比32位(30秒)快大约4倍。不过这只是一个特例。


处理 Int64 而不是 Int32 时会非常明显。在这里,C 也有4倍的差异。 - Joey
当您使用Any CPU编译它时会发生什么?据我所知,它应该像在x64系统中编译为x64一样工作。 - dr. evil
如果您直接在x64机器上运行Any CPU .exe,它将以64位模式运行。但是,如果32位主机正在进程中加载它,则它将以32位模式运行。 - Mehrdad Afshari

1

不必担心在x64系统上需要定位到x86。虽然你会错过额外的x64优势,最终运行在32位仿真层,但这比完全崩溃要好得多,大多数现有应用程序仍为32位。

在.Net中,需要这样做的常见原因是依赖于本地的32位dll。如果将你的.Net定位为任何CPU,它将尝试在64位模式下加载你的32位dll,导致崩溃。最终,你需要摆脱这种依赖关系,以便使用64位模式。但对于一个版本来说,这并不会致命。


1
答案是“这取决于”。它取决于您的应用程序做什么,是否经常访问内存。Kevin是正确的:处理器确实需要频繁进行地址转换,但这可能不会对应用程序的性能造成太大影响。x86和amd64之间的底层硬件指令基本相同,假设CLR作者知道他们在做什么(我相信他们知道),那里面也没有太多的低效率。如果您正在进行图形操作,您可能会看到很大的性能差异,但由于这只是一个.NET应用程序,我认为您不会这样做。对于一些数字计算任务,您可能会注意到Mehrdad提到的差异,尽管如果您这样做,我会感到惊讶。
总的来说,除非您有一个性能敏感的应用程序,否则我会说不要担心性能问题。然后,只有在了解您的应用程序的性质后才担心性能问题。

1

如果您经常使用结构体,并且有很多64位计算(double,long),那么由于32位Jit引擎相对于64位引擎不够先进,您将看到性能下降。

否则,.Net的32位和64位版本在性能方面有些相似。

而且,如果您不需要超过2GB的进程限制,则不需要64位寻址能力,操作系统会使用称为Long Mode - Compatibility SubMode的特殊CPU模式为您处理。(实际上,CPU正在以64位模式运行,但出于兼容性考虑,使用32位进行寻址)


0
你需要记住的是,在64位环境中运行32位进程时,系统必须对其进行内存地址转换。这是不好的吗?这取决于具体情况。它肯定不如可能的那样高效。在x-64服务器上运行32位版本的IIS与其潜力相比非常缓慢。这完全取决于应用程序的需求。

我认为现代操作系统中的每个进程都应该在使用时将虚拟地址空间转换为物理地址。 - Mehrdad Afshari
不过,x64有一些优点,比如更多更大的寄存器,但也有缺点,比如双指针大小导致应用程序更大,这会使缓存和内存带宽效率降低。无论如何,假设使用合理的编译器,则速度应该大致相同。 - Pop Catalin
在 .Net 的情况下,区别在于 Jit 引擎在 64 位上更加先进(或者我应该说 32 位的 jit 编译器不够先进,特别是在处理像 long double 这样的 64 位结构时,这是 32 位 C++ 编译器没有的问题)。 - Pop Catalin
同意Pop Catalin的观点。64位.NET Framework的JIT似乎比32位版本的表现要好得多。 - Mehrdad Afshari

0

不会有问题。实际上,我们经常发现我们的 32 位应用程序在 64 位 Vista 上运行比在 32 位 Vista 上更好,由于较新的操作系统内存管理器。直接针对 x86 应该可以很好地工作。然而,能够在 64 位上本地运行将具有其他优点,如能够访问更多的内存,提供更多的 CPU 寄存器等,因此如果可能的话,值得投入努力来使其正常运行。


0

我原本想说最好的方法是测量,但显然如果它无法正常运行,那么测量就有点困难。

首先看看是否存在性能问题。 如果似乎存在问题,则请尝试确定在应用程序中何处不符合x64规范。 大多数.NET代码应该是平台无关的,因此最有可能的罪魁祸首是任何本机Interop或第三方库。


0

你的“bug”是不是因为你的.NET代码使用了32位的COM对象?

当在一个已经编译成AnyCPU设置的64位架构上运行.NET进程时,这种情况可能会成为一个问题。

原因是该进程将作为64位进程执行,任何在进程中执行的COM组件也必须是64位版本。如果不是这种情况,你的进程将退出。

一个可能的解决方案是将目标平台设置为x86。


我之前使用了WebBrowser控件,但我认为它不兼容x64。我想问题可能出在MS Access 2007上,但我记不清了。 - dr. evil

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接