在64位计算机上基于AnyCPU vs x64平台构建的C#应用​​程序的性能

Sau*_*R S 34 .net c# clr

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

svi*_*ick 30

不,在64位Windows上运行的AnyCPU应用程序与在其上运行的x64应用程序之间的性能没有差异.标志更改的唯一内容是编译程序集的标头中的一些标志,CLR仅使用它来决定是使用x86还是x64,没有别的

如果您在询问在64位Windows上运行的x86应用程序与x64(或AnyCPU)之间是否存在差异,那么答案是肯定的.两者之间的差异是:

  • 64位显然使用的引用是32位的两倍,这意味着更大的内存消耗,但它也意味着你可以使用更多的内存
  • 64位可以使用更多仅在64位CPU模式下可用的寄存器
  • 64位JIT与32位JIT不同,它有不同的优化集:例如64位JIT有时会使用尾调用优化,即使您没有使用tail.指令专门请求它(例如C#永远不会)

  • 有一个值得注意的区别,由C#或vb.net编译器编译的EXE以目标x64运行,主线程为4兆字节堆栈.模糊的事实,与问题无关. (4认同)
  • @TomTom 32位代码*可能*更快,但也可能更慢,这取决于您使用的代码类型.在某些情况下,拥有更大的引用可能并不重要,但可能会有更多的寄存器. (3认同)

小智 7

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

  • 使用x64而不是AnyCPU时会出现同样的问题吗? (2认同)