32位整数在64位环境下的性能表现(C++)

13
我们已经开始编译我们一些应用程序的32位和64位版本。 我们项目中的一个人鼓励我们将所有32位整数转换为它们的64位等效项,即使这些值保证适合32位空间。 例如,我有一个保证不超过10,000的值,我正在使用无符号int存储它。他建议将其切换为size_t,以便在64位环境中扩展到64位,即使我们永远不需要额外的空间。 他说,使用64位变量将加速应用程序,而不管每个变量中存储的值如何。 他是对的吗? 这将需要大量的工作,如果实际上没有任何区别,我就不想付出这种努力。
我们正在使用Microsoft Visual C++ 2008。虽然我希望得到更普遍且独立于平台的答案。
那么你认为呢?我们是否正确花费时间更改数据类型以提高性能,而不是范围原因?

2
为什么不写一个基准测试来试一下呢? - Amok
@Amuck,+1 鼓励你去尝试并发现它的好处。 - Carl Norum
我喜欢基准测试的想法,只要它不会花费我太多时间,因为我希望通过进行所有这些代码更改来避免浪费时间。 - Darryl
3
如果这样做导致速度提升,我会感到惊讶,而且很可能会使您的代码运行更慢——内存带宽仍然是一个限制因素。通过全面采用64位整数而不是32位整数,您增加了需要在总线上移动的内存量,并增加了缓存未命中的机会。 - Michael
__int__类型根据语言定义应该是编译器上最高效的整数类型。为什么不检查一下sizeof(int)的结果呢? - Martin York
6个回答

17

我认为你正在面对一个严重的过早优化问题。在分析器明确告诉你这是导致性能问题的重要原因之前,请不要对应用程序进行微小更改。

否则,你将花费很多时间去“修复”不存在的问题。


10

如果32位操作在64位寄存器中进行,需要发出一些额外的指令来处理设置进位/溢出标志等事情。虽然我不认为你会注意到任何明显的性能提高,但我几乎可以保证,在你的程序中还有更糟糕的瓶颈。


这在x64上是真的吗?我对它在汇编级别上不太熟悉,但如果是这样的话,对我来说有点令人惊讶。我知道问题并没有要求关于x64的具体信息,但我很想知道。 - Michael Burr
嗯,这是个好问题。我得拿出书来查一下。你可以想象,这从来不值得去弄清楚。我对ARM更熟悉,对于那种架构,使用本地大小在代码生成方面要好得多。使用8位类型会导致所有种类的额外掩码和移位操作在代码中出现。尽管如此,它通常不会对性能产生任何重大影响。 - Carl Norum
我也希望32位操作是通过特定的32位指令完成的,这些指令会处理进位/溢出标志。但我不确定! - mmmmmmmm
@rstevens,我也考虑过这个问题;这就是拥有复杂指令集的优势之一! - Carl Norum
哈哈,我可以保证还有更糟糕的瓶颈! - Darryl

8
首先,在64位环境中使用64位整数而不是32位整数通常不会加速任何操作。根据上下文和编译器的能力,这实际上可能会减慢速度。通常情况下,您应该优先使用 int/unsigned int 类型来存储程序中的整数值,并仅在真正需要时切换到其他类型。最终,这个问题的明确答案只能通过实际实验获得,因为它取决于太多变量。
其次,任何建议将 size_t 用作通用无符号类型的人都应立即被禁止访问代码,并在允许再次接触代码之前参加一些C/C++课程。

3
一个反驳观点:使用short / int / long等类型有一定的风险,因为它们的行为不能保证在所有平台上都相同。例如,如果您将值存储为int类型,则在某些平台上可存储的最大值为(2^31)-1,在其他平台上则为(2^63)-1。在许多情况下,这种行为上的变化不会有任何影响,但在某些情况下却会有影响,而且很难事先确定哪些情况会出现问题。因此,int32_t、int64_t等类型更可取,因为它们在所有情况下明确定义了类型的行为。 - Jeremy Friesner

4

不要这样做。这只意味着CPU无法在高速缓存中保存太多数据,而访问主存储器的惩罚比大多数其他操作都要高得多。


2
使用64位整数与32位整数相比速度更快的想法是错误的。在您的代码中,更重要的是使用适当的类型。例如,当引用数组或数据结构的大小时,请使用size_t,因为这就是size_t应该表示的内容。如果您要存储一些数据,则使用int而不是size_t,因为这就是int所描述的内容。
不要仅仅将所有内容更改为size_t,因为它会“自动变成64位”,这可能不会带来任何改进。这将导致更大的内存开销,可能会由于较大的内存空间而导致应用程序由于缓存未命中而变慢。这还可能导致意外的错误。

1

我猜(仅仅是猜测),如果增加内存导致某些内存访问失去了局部性,使得缓存更频繁地被清空,那么你可能看不到性能的提升,甚至可能会略微下降。

正如JaredPar所说,如果没有实际原因或者除非你需要更大范围的整数,否则这可能是浪费时间。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接