【问题标题】:Performance of 32-bit integers in a 64-bit environment (C++)32 位整数在 64 位环境中的性能 (C++)
【发布时间】:2009-11-17 17:27:56
【问题描述】:

我们已经开始编译部分应用程序的 32 位和 64 位版本。我项目中的一个人鼓励我们将所有 32 位整数转换为它们的 64 位等效值,即使这些值保证适合 32 位空间。例如,我有一个保证永远不会超过 10,000 的值,我将其存储在一个无符号整数中。他的建议是将其切换为 size_t 以便它在 64 位环境中扩展到 64 位,即使我们永远不需要额外的空间。他说使用 64 位变量将加速应用程序,而不管每个变量中存储的值如何。他是对的吗?结果证明工作量很大,如果它实际上没有任何作用,我并不急于付出努力。

我们使用的是 Microsoft Visual C++ 2008。不过,我有点希望得到一个更通用、独立于平台的答案。

那你怎么看?出于性能原因而不是范围原因,我们花时间更改数据类型是否正确?

【问题讨论】:

  • 你为什么不写一个基准测试一下?
  • @Amuck,+1 只是尝试并找出答案。
  • 我喜欢基准测试的想法,只要我希望通过更改所有这些代码来避免浪费我的时间。
  • 如果这会导致加速并且可能会导致您的代码运行速度变慢,我会感到惊讶 - 内存带宽仍然是一个限制因素。通过全面采用 64 位整数而不是 32 位,您增加了需要通过总线移动的内存量并增加了缓存未命中的机会。
  • int 类型应该是(根据语言定义)编译器上最有效的整数类型。为什么不检查 sizeof(int) 的结果是什么。

标签: c++ integer performance


【解决方案1】:

我认为您面临着一个巨大的未成熟优化案例。在分析器明确告诉您这是严重性能问题的根源之前,切勿在您的应用程序中进行此类微更改。

否则您将花费​​大量时间修复非问题。

【讨论】:

    【解决方案2】:

    如果 32 位操作发生在 64 位寄存器中,则确实需要发出一些额外的指令来处理设置进位/溢出标志等事情。如果您意识到任何明显的性能,我会感到惊讶改进,虽然。我几乎可以保证您的程序中存在更严重的瓶颈。

    【讨论】:

    • 这在 x64 上是真的吗?我在装配级别上对它不够熟悉,无法知道,但这对我来说有点令人惊讶。我知道这个问题不是询问 x64 的细节,但我很想知道。
    • 嗯,这是个好问题。我得把书拿出来检查一下。正如您可能想象的那样,它从来不值得弄清楚。我更熟悉 ARM,并且在该架构上,就代码生成而言,使用本机大小要好得多。使用 8 位类型会导致代码中出现各种额外的屏蔽和移位操作。也就是说,它不会对性能产生任何重大影响。
    • 我还希望通过处理进位/溢出标志的特定 32 位指令进行 32 位操作。但我不知道!
    • @rstevens,我也想过;拥有复杂指令集的优势之一!
    • 大声笑,我可以保证还有更严重的瓶颈!
    【解决方案3】:

    首先,在 64 位环境中使用 64 位整数而不是 32 位整数通常不会加速任何事情。根据上下文和编译器的能力,这实际上可能会减慢速度。通常,您应该更喜欢使用int/unsigned int 类型在程序中存储整数值,仅在真正需要时才切换到其他类型。最后,这个问题的最终答案只能通过实际实验得到,因为它取决于太多的变量。

    其次,任何建议为此目的使用size_t(作为通用无符号类型)的人都应立即被拒绝访问代码,并在他们被允许再次接触代码之前被派去学习一些 C/C++ 类。

    【讨论】:

    • 反驳:short / int / long / etc 使用起来有些风险,因为不能保证它们的行为在所有平台上都是相同的。例如,如果您将值存储为 int,则在某些平台上最大可存储值为 (2^31)-1,而在某些平台上为 (2^63)-1。在许多情况下,行为的改变不会产生任何影响,但在某些情况下会产生任何影响,而且事先并不总是很明显哪些情况是哪些情况。因此 int32_t、int64_t 等更可取,因为它们在所有情况下都明确定义了类型的行为。
    【解决方案4】:

    不要这样做。这只是意味着 cpu 将无法在缓存中保存尽可能多的数据,并且进入主内存的惩罚比大多数其他事情要高得多。

    【讨论】:

      【解决方案5】:

      使用 64 位整数与 32 位整数会加快速度的想法是一个神话。代码中更重要的是使用适当的类型。例如,在引用数组或数据结构的大小时,请使用 size_t,因为这是 size_t 应该表示的内容。如果您要存储一些数据,请使用 int 而不是 size_t,因为这就是 int 所要描述的内容。

      不要只是将所有内容都更改为size_t,因为它将“自动变为 64 位”,这可能不会导致任何改进。这将导致更大的内存开销,这可能会由于更大的内存空间而导致应用程序由于缓存未命中而变慢。它也很可能会导致意想不到的错误。

      【讨论】:

        【解决方案6】:

        我猜(这只是一个猜测)您可能会看到性能没有任何改进,并且如果内存量增加导致某些内存访问失去引用的局部性并将事情排除在外,您可能会看到性能略有下降缓存比以前更频繁。

        作为JaredPar says,如果没有事实理由这样做,或者除非您需要更大的整数范围,这可能是浪费时间。

        【讨论】:

          猜你喜欢
          • 2011-04-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-11-27
          • 1970-01-01
          • 2016-06-01
          • 2014-04-01
          相关资源
          最近更新 更多