SHA256在x64版本中管理速度是原来的两倍 - 这是典型的吗?

时间:2011-01-27 16:43:11

标签: .net performance 64-bit

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

但是,一个非常简单的测试表明,在64位计算机上,如果应用程序是x86,则SHA256Managed哈希值为10 MB字节数组的速度几乎是x64的两倍。因此,任何执行大量SHA256散列的应用程序都会因为“任何CPU”或两个平台的单独构建而受益匪浅。

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

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

4 个答案:

答案 0 :(得分:4)

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

答案:这取决于。

64位是很多与32位不同,这是一个完全独立的讨论。你不能从任何知道他们所谈论的内容的人那里得到明确答案的原因是有些事情更快,而其他事情则更慢。但是一些应用程序和某些算法明显可以从中受益。

64位可以解决更多问题,当时移动更大的数据块,拥有更多寄存器,使共享库更快等等。但它也会改变中断的工作方式(iirc),有更多的指令(​​尽管有些旧的被删除) ),在较小的数据块上效率较低,堆栈和指针占用更多空间等等。

如果你对CPU功率有很高的要求,那么购买更强大的CPU通常比在这样的级别上调整程序更便宜......可悲的是!但要确定某个算法在任一平台上的效率,您必须对其进行测试。

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

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

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

答案 1 :(得分:2)

答案 2 :(得分:1)

不,这不典型。

64位整数运算的使用不是应用程序性能的典型(!)度量。如果这确实构成了应用程序时间的很大一部分(否则它完全无关紧要),那么您有一个处理数据加密/解密的应用程序,我认为您同意这不是每个定义的典型应用程序。

  

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

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

答案 3 :(得分:0)

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

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