在64位机器上,基于AnyCPU和x64平台构建的C#应用程序性能对比

35

我需要在一台64位机器上部署一个C#应用程序,但是有一点可能它也需要被部署到32位机器上。我应该构建两个针对x86和x64平台的分开的可执行文件,还是应该选择构建一个针对“AnyCPU”平台的单个可执行文件(在项目属性的“生成”选项中指定)?如果一个针对“AnyCPU”平台构建的C#程序集在64位机器上部署与同样针对“x64”平台特别构建的程序集之间是否会有任何性能差异?


你可以尝试一下并比较文件。我猜唯一的区别就是清单。 - Joey
2个回答

34
不,任何CPU应用程序在64位Windows上运行时与x64应用程序在其上运行时的性能没有区别。标志改变的唯一事情是已编译程序集头部中的一些标志,CLR仅用它来决定是否使用x86或x64,没有其他影响。
如果您问的是在64位Windows上运行的x86应用程序和x64(或AnyCPU)之间是否有区别,则答案是肯定的。两者之间的区别如下:
- 64位显然使用两倍于32位的引用,这意味着更大的内存消耗,但也意味着您可以使用更多内存。 - 64位可以使用仅在CPU的64位模式下可用的更多寄存器。 - 64位JIT与32位JIT不同,具有不同的优化集:例如,64位JIT有时会使用tail call optimization,即使您没有使用tail.指令明确请求它(例如C#从不这样做)。

3
32位的代码 可能 更快,但也 可能 更慢,这取决于你使用的代码类型。在某些情况下,拥有更大的引用可能并不重要,但拥有更多寄存器可能会更有帮助。 - svick
1
不,通常情况下32位更快。不要忘记垃圾回收器之类的东西。这就是为什么微软建议在32位模式下运行应用程序时使用IIS...主要问题出现在32位地址空间变得拥挤时,这在大多数情况下都是如此,特别是在.NET下(需要比手动管理更多的内存)。但像记事本这样的东西在64位下运行就是一件愚蠢的事情。 - TomTom
1
@TomTom和svick非常感谢。如果两个版本之间没有明显的区别,那么为什么开发人员要选择专门为x64构建他们的C#程序集,而选择为AnyCPU构建将在64位平台上产生相同的结果。 - Saurabh R S
4
C#或vb.net编译器编译的EXE文件,用于x64的主线程运行时使用4兆字节的栈。这是一个不太常见的事实,与问题本身无关。 - Hans Passant
1
@TomTom,今天这种情况已经改变了,现在通常需要更改设置才能允许32位dll在IIS上执行。 - Crypth
显示剩余2条评论

9
作为对上面答案的补充说明,使用P/Invoke或DotNetInterop在x64操作系统上调用x86 DLL时会出现问题。如果没有64位版本的DLL,则可能需要编译x86而不是AnyCPU,因为操作系统将尝试加载64位版本并失败。

2
使用x64而不是AnyCPU,同样的问题是否存在? - Slugart

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