c# - 移植应用程序时有效利用 64 位架构

标签 c# .net performance 64-bit

我正在考虑将处理器密集型 32 位 .NET 4 (C#) 控制台应用程序移植到 64 位。它是一种并行化的数字运算算法,运行大约五个小时。

我对性能优势略有了解,但不确定如何更改代码以充分利用 64 位架构。例如,我是否应该考虑将所有 Int32 类型更改为 Int64 等?

我在哪里可以找到一些全面的资源来了解移植到 x64 时的优化注意事项?四处搜索主要是关于 x64 架构的一般信息。

最佳答案

您的辛勤工作获得返回的希望渺茫。 x64 内核的运行速度与 x86 内核相同,时钟速度相同并受硅物理特性的限制。 x64 内核的一个明显优势是它可以同时处理 64 位,是 x86 内核的两倍。但在实践中,很少有现实世界的问题实际上需要这个范围。大多数整数问题在 +/- 20 亿的范围内都能正常工作。从您的代码中很容易看出,如果您在最内层的循环中有很多 long 而不是 int 变量,那么您就会领先。

x64 核心的一个显着缺点是它消耗可用缓存的速度要快得多。这也受到硅的限制,它们只能在芯片上安装这么多内存。在 32 位模式下,任何指针都是双倍大小,8 字节而不是 4 字节。指针用于任何对象引用。缓存在现代内核上是一个非常的大问题,与内核的速度相比,内存总线非常慢。 x64 多了 8 个 cpu 寄存器(r8 到 r15),在某种程度上平衡了这个缺点。

最终效果是 32 位代码的执行速度通常比 64 位代码。只有当您的程序因必须将其处理的数据塞入 2 GB 地址空间而陷入困境时,您才能从 64 位代码中获益。换句话说,必须使用文件或内存映射文件来避免内存不足。如果您的应用程序受到计算限制,正如您的问题中所建议的那样,您不太可能领先。

关于c# - 移植应用程序时有效利用 64 位架构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12051707/

相关文章:

c# - 为什么 ASP.Net Identity 2 存储在 NVARCHAR 中的 UserId 中?

c# - 反序列化 BSON ReadBsonType 只能在 State 为 Type 时调用

java - 如何减少 HashMap<String, Integer> 类数据结构的内存使用

c# - 如何同时运行两个具有不同返回类型的任务列表

c++ - 在包围点的网格内找到三角形的快速方法

c++ - Qt Creator 性能问题

c# - 使用类型泛型时如何正确地将类转换为抽象类?

c# - Ubuntu 16.04 上的 System.Security.Cryptography.Csp

c# - 检查文件是否存在于忽略扩展名的目录中

c# - 在嵌入式代码中使用动态类型的 c# 变量