Dav*_*rtz 40
这取决于确切的CPU和操作.例如,在64位Pentium IV上,64位寄存器的乘法速度要慢得多.Core 2和更高版本的CPU从头开始设计用于64位操作.
通常,即使为64位平台编写的代码也使用32位变量,其中值将适合它们.这主要不是因为算术更快(在现代CPU上,通常不是),而是因为它使用更少的内存和内存带宽.
如果那些整数是32位而不是64位,那么包含十二个整数的结构的大小将是其一半.这意味着它将需要一半的字节来存储,一半的空间在缓存中,依此类推.
使用64位本机寄存器和算术,其中值可能不适合32位.但主要的性能优势来自x86_64指令集中可用的额外通用寄存器.当然,64位指针带来了所有好处.
所以真正的答案是无所谓.即使您使用x86_64模式,您也可以(并且通常会)使用32位算术,并且您可以获得更大指针和更多通用寄存器的好处.当您使用64位本机操作时,这是因为您需要64位操作,并且您知道它们比使用多个32位操作伪装它更快 - 您唯一的另一种选择.因此,32位与64位寄存器的相对性能决不应成为任何实现决策的决定因素.
小智 8
我只是偶然发现了这个问题,但我认为这里缺少一个非常重要的方面:如果你真的使用类型'int'来查看汇编代码,那么索引可能会减慢编译器生成的代码.这是因为'int'在许多64位编译器和平台(Visual Studio,GCC)上默认为32位类型,并使用指针(在64位操作系统上必须是64位)进行地址计算,而'int'将导致编译器发出不必要的32位和64位寄存器之间的转换.我刚刚在代码的一个非常性能关键的内循环中体验过这一点.从'int'切换到'long long'作为循环索引将我的算法运行时间提高了大约10%,考虑到我此时已经使用的广泛的SSE/AVX2矢量化,这是一个巨大的收益.