2

我正在将一个复杂的算法从 32 位移植到 64 位,在运行 Windows 7 64 位的 8GB RAM 的 Core i5 机器上计算大约需要 5 个小时。

该应用程序以 .NET 4 为目标,将任务并行库用于大约 60% 的循环,并使用 BigInteger 类。

我正在处理两个数字范围:

  • 0 到 ulong.MaxValue(大约是算法的 50%)。
  • 具有数十万位数的非常大的整数(约占算法的 50%)。

对这些数字执行的操作包括加法、减法乘法、除法、对数和幂。

一旦移植到 64 位,我将能够分析和计时代码以查看性能提升,但我想知道是否可以通过计算来估计它。

如果是这样,请推荐一些解释相同的文章。

4

3 回答 3

5

我不确定您要移植什么(除非混合使用本机代码)。如果您已经有一台 64 位机器,只需确保您以 64 位运行时为目标(默认的 AnyCPU 会这样做)。

具体的性能改进将取决于算法的性质。对于可能给您一个数量级的测量,请参阅

为什么 64 位比 32 位更快?

您可以看到的最佳情况是 2 倍,但您的实际改进可能远低于此。

另一方面,64 位代码占用更多内存(地址为 64 位)。如果迁移到 64 位碰巧由于 JITed 代码所需的内存增加而迫使您开始交换,则整体性能可能会降低。

于 2012-07-31T00:08:53.803 回答
2

根据阿姆达尔定律,您将看到最大速度提高了 1.33 倍。有一些应用程序(例如,位板国际象棋引擎)从 32 位到 64 位几乎可以使性能翻倍,但那是当几乎所有数据都是 64 位并使用按位操作进行操作时。没有具体细节很难说,但在你的情况下,它可能会小于预测的因素。

于 2012-07-31T00:08:17.407 回答
0

恐怕尝试和衡量是唯一合理的方法。特别是因为您正在“将...... 32 位移植到 64 位”,它假设至少部分代码重写,因此很难就性能数字给出任何指导。

由于指针较长,x64 代码和数据占用的空间稍多,但提供的地址空间要大得多。因此,根据代码,您可能会在任何方向上获得性能变化。

于 2012-07-31T00:14:25.753 回答