34

我必须在 64 位机器上部署 C# 应用程序,尽管它也有可能部署在 32 位机器上。我应该针对 x86 和 x64 平台构建两个单独的可执行文件,还是应该针对“AnyCPU”平台构建单个可执行文件(在项目属性的“构建选项”中指定)。针对“AnyCPU”构建的 C# 程序集之间是否存在任何性能差异部署在 64 位机器上与专门针对“x64”平台构建的相同程序集?

4

2 回答 2

34

不,在 64 位 Windows 上运行的 AnyCPU 应用程序和在其上运行的 x64 应用程序之间的性能没有差异。唯一改变标志的是已编译程序集标头中的一些标志,CLR 仅使用它来决定是使用 x86 还是 x64,仅此而已

如果您问在 64 位 Windows 和 x64(或 AnyCPU)上运行的 x86 应用程序之间是否有区别,那么答案是肯定的。两者的区别在于:

  • 64位显然使用的引用是32位的两倍,这意味着更大的内存消耗,但这也意味着你可以使用更多的内存
  • 64 位可以使用更多的寄存器,这些寄存器只有在 CPU 的 64 位模式下才可用
  • 64 位 JIT 与 32 位 JIT 不同,它有不同的优化集:例如 64 位 JIT 有时会使用尾调用优化,即使您没有使用tail.指令特别请求它(例如 C# 从来没有)
于 2012-06-16T09:01:23.037 回答
8

作为上述答案的旁注。在使用 AnyCPU 的 x64 操作系统上将P/InvokeDotNetInterop用于 x86 DLL可能会出现问题。在没有 64 位版本的 DLL 可用的情况下,可能需要编译 x86 而不是 AnyCPU,因为操作系统将尝试加载 64 位版本......并且失败。

于 2013-05-02T16:30:15.400 回答