【问题标题】:SHA256Managed twice as fast in x64 builds - is this typical?SHA256Managed 在 x64 构建中的速度是原来的两倍 - 这是典型的吗?
【发布时间】:2011-06-16 16:37:11
【问题描述】:

据说可以在 x86 模式下编译 .NET 应用程序,因为 x64 提供的唯一好处是更大的虚拟地址空间,因此允许应用程序分配超过 2(或 3)GB内存,或者内存映射非常大的文件。

但是,一个非常简单的测试表明,在 64 位计算机上,SHA256Managed 对 10 MB 字节数组的哈希处理速度几乎是 x86 应用程序的两倍。因此,任何执行大量 SHA256 散列的应用程序都可以从“任何 CPU”或为两个平台单独构建中获得相当大的好处。

我的问题是:这是 .NET 的典型结果吗?在 64 位操作系统上以 64 位模式运行其他计算量大的任务是否同样受益?当然,我可以只测试每一个特定的计算,但我会欣赏一个整体的“经验法则”,例如:

  • 是的,任何进行大量整数运算的东西都会快得多
  • 是的,所有数值计算都快得多(包括双精度/小数)
  • 不,这是一个罕见的例外,大多数算法在两种模式下的运行速度大致相同

【问题讨论】:

  • x64 多了 8 个 CPU 寄存器。非常适合 SHATransform(),有很多局部变量。很少见。
  • GZipStream 压缩在 x86 模式下慢了 20% - 没有那么明显,但很明显。

标签: .net performance 64-bit


【解决方案1】:

首先,很高兴您能分享测试结果。

答案:视情况而定。

64 位是 很多 与 32 位不同的,这是一个完全独立的讨论。您无法从任何知道他们在说什么的人那里得到明确答案的原因是有些事情更快,而其他事情则慢。但某些应用程序和某些算法显然确实从中受益。

64 位可以寻址更多,同时移动更大的数据块,有更多的寄存器,使共享库更快,等等。但它也改变了中断的工作方式(iirc),有更多的指令(​​虽然一些旧的被删除了),在较小的数据块上效率较低,堆栈和指针占用更多空间等。

如果您对 CPU 能力有很高的要求,那么对于企业来说,购买更强大的 CPU 通常比在这样的水平上调整程序更便宜……遗憾!但是要确定某个算法在任一平台上的效率,您必须对其进行测试。

在机器代码中,您添加的每个堆栈项都占用两倍的内存,因此在 L1、L2 和内存之间移动的数据量是两倍。但是对于每次计算和内存读取/写入,您可以每次处理更多数据(大量数据的更高吞吐量)。所以这取决于你传递了多少数据以及你正在做多少和什么样的算术。然后考虑与仅移动 4k 页面的操作系统相比,速度的增益/损失,并且存储的每个指针占用的高价值 L1 和 L2 缓存的两倍...+我不记得的所有内容。

我的观点是,问题很快就会变得复杂,而且答案会非常具体。

我想说强制 .Net 应用程序使用 32 位的唯一原因是它是否引用了 32 位库。在执行代码之前无法确定这种依赖关系,因此会导致异常。

【讨论】:

  • “强制 .Net 应用程序使用 32 位的唯一原因是它是否引用了 32 位库” - 这也是我的立场,直到 MS 将 x86新项目的默认设置。这让我重新考虑。但是我现在又回到了这个想法 :) 只是等待在 x64 中编辑并继续的能力......
  • 确实如此。直到那时它的条件断点和立即。我还怀疑 x64 编译器还没有像 x86 那样优化,因为它是一个相对较新的产品。因此,随着时间的推移,我们可能会看到速度的提高。 (iirc Java 曾经有过一次非常大的飞跃)
  • 实际上,据说 x64 JIT 对它发布的内容做了很多优化。很难说它总体上“更快”,因为 JIT 阶段比较慢,而运行时比较快......
【解决方案2】:
【解决方案3】:

不,这不是典型的。

64 位整数算术的使用不是应用程序性能的典型 (!) 衡量标准。如果这确实占了您应用程序时间的很大一部分(否则它完全不相关),那么您有一个处理数据加密/解密的应用程序,我认为您会同意这不是一个典型的应用程序。

•是的,任何进行大量整数运算的东西都会快得多

没有。任何对其 CPU 使用率的很大一部分进行整数数学运算的事情(这可能与开始执行许多运算不同)都可能会增加。这基本上将影响限制在相当多的副作用应用程序上。例如,Web 应用程序不会进行 SHA 加密 - SSL 将由内核处理。

【讨论】:

  • 我认为问题是专门询问它是否是典型的计算量大的任务,而不是任何随机应用程序。
  • 嗯,大多数计算繁重的任务都会使用浮点数;)
【解决方案4】:

当使用在 64 位 CPU 寄存器上运行的机器代码指令时,涉及 longulong 的操作肯定会快两倍。在 32 位模式下,这些操作被“模拟”为两个(或更多)单独的指令,这也是为什么在 32 位模式下读取和写入 64 位值不是原子操作的原因。

也就是说,大多数计算量大的任务可能仍然使用 32 位值(intuint)或更小。这些没有速度差异。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-27
    • 1970-01-01
    • 1970-01-01
    • 2021-03-20
    • 1970-01-01
    • 1970-01-01
    • 2021-07-02
    相关资源
    最近更新 更多