【问题标题】:Performance of a C# application built on AnyCPU vs x64 platform on a 64 bit machine基于 AnyCPU 的 C# 应用程序的性能与 64 位计算机上的 x64 平台的性能对比
【发布时间】:2012-06-16 08:48:21
【问题描述】:

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

【问题讨论】:

标签: c# .net clr


【解决方案1】:

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

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

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

【讨论】:

  • @TomTom 32 位代码可能更快,但也可能更慢,这取决于您使用的代码类型。在某些情况下,拥有更大的引用可能并不重要,但拥有更多的寄存器可能。
  • 不,32 位通常更快。不要忘记垃圾收集器之类的东西。这就是 MS 建议 IIS 仅在 32 位模式下运行应用程序的原因......当 32 位地址空间变得拥挤时,主要问题就出现了,如今大多数情况都是如此,尤其是在 .NET 下(需要更多ram 比手动管理)。但是以 64 位运行记事本之类的东西是一回事 - 完全愚蠢。
  • @TomTom & svick Thnx 很多。如果两个构建之间没有明显差异,那么当开发人员选择为 AnyCPU 构建时,何时以及为什么选择专门为 x64 构建 C# 程序集将在 64 位平台上给出相同的结果。
  • @Saurabh 例如,如果您的应用程序依赖于一些本机 x64 库,那么您甚至不想尝试在 x86 中运行它,如果您做错了。
  • 有一个显着的区别,由 C# 或 vb.net 编译器编译为目标 x64 的 EXE 以 4 兆字节的堆栈为主线程运行。晦涩的事实,与问题无关。
【解决方案2】:

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

【讨论】:

  • 用x64代替AnyCPU会不会出现同样的问题?
猜你喜欢
  • 2017-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-19
  • 1970-01-01
  • 2012-02-15
  • 2012-10-24
相关资源
最近更新 更多