x64 vs x86性能注意事项.Net

时间:2011-06-28 20:32:50

标签: c# performance 64-bit

我试图了解在x64和x86中运行本机C#/ .Net 4.0应用程序时存在哪些性能差异。我理解内存注意事项(x64寻址所有内存,x86限制为2 / 4gb),以及x64应用程序将使用更多内存的事实(所有指针都是8字节而不是4字节)。据我所知,这些都不会影响时钟指令的任何时钟,因为x64流水线的宽度足以处理更广泛的指令。

由于每个线程的堆栈大小较大,上下文切换是否会影响性能?在评估两者时我缺少哪些性能考虑因素?

2 个答案:

答案 0 :(得分:18)

乔怀特给了你一些很好的理由说明你的应用可能会变慢。较大的指针(因此扩展为.NET中较大的引用)将占用更多的内存空间,这意味着更少的代码和数据将适合缓存。

但是,您可能希望使用x64有很多有益的理由:

  • 默认情况下,x64使用AMD64调用约定,并且可以比标准的cdecl或stdcall快得多,其中许多参数在寄存器中传递,并使用XMM寄存器作为浮点。

  • CLR将发出标量SSE指令,用于处理64位浮点运算。在x86中,它使用标准的x87 FP堆栈,这个速度相当慢,特别是对于在int和浮点之间进行转换的事情。

  • 拥有更多寄存器意味着由于注册压力,JIT将不得不泄漏它们的可能性要小得多。对于快速内部循环,溢出寄存器的成本非常高,特别是如果函数内联并在那里引入额外的寄存器压力。

  • 64位整数上的任何操作都可以通过放入单个寄存器而不是分成两个单独的一半而获益匪浅。

  • 这可能是显而易见的,但是如果您的应用程序是内存密集型的,即使它没有达到理论限制,您的进程可以访问的额外内存也非常有用。碎片可能会导致您在达到该标记之前很久就遇到“内存不足”状态。

  • x64中的RIP相对寻址在某些情况下可能是reduce the size of an executable image。虽然这并不直接适用于.NET应用程序,但它可以对共享DLL有影响,否则可能需要重新定位。我有兴趣知道是否有任何关于.NET和托管应用程序的具体信息。

除此之外,至少在当前版本中,x64版本的.NET运行时似乎执行比x86等效更多的优化。内联和内存对齐等内容似乎更常发生。实际上,前一段时间存在一个错误,阻止了内联或返回值类型的任何方法;我记得在x64而不是x86版本中看到了它。

实际上,您能够分辨哪种方式更适合您的应用的唯一方法是对两种架构进行分析和测试,并比较实际结果。但是,我个人只是尽可能使用任何CPU,并避免任何本质上依赖于架构的东西。这使得构建和部署变得容易,并且当大多数用户开始专门切换到x64时,希望更具未来性。

答案 1 :(得分:5)

与“x64应用程序将使用更多内存”密切相关的事实是,使用64位应用程序,您的引用位置较小(因为所有指针大小都加倍),因此您可以获得更少的里程数CPU的板载(超快)缓存。您必须更频繁地从系统RAM中检索数据,这比L2甚至L1片上缓存慢得多。