为啥 uint32_t 与 uint64_t 速度不同?

Posted

技术标签:

【中文标题】为啥 uint32_t 与 uint64_t 速度不同?【英文标题】:why a uint32_t vs uint64_t speed difference?为什么 uint32_t 与 uint64_t 速度不同? 【发布时间】:2013-11-17 14:14:28 【问题描述】:

试图了解 g++/cpu 在运行时如何处理整数。

我正在测量以下函数的运行时间:

template<class T>
void speedTest() 
    for(T d=0;d<4294967295u;d++)int number;

这个简单的方法会多次运行 uint32_t 的最大值的哑循环

当我打电话时:

speedTest<uint32_t>();

该软件平均需要 8.15 秒,但当我调用时:

speedTest<uint64_t>();

软件平均耗时 10.35 秒。

为什么会这样?

【问题讨论】:

在 32 位代码中增加一个 64 位变量需要更多的工作。尤其是当您分析尚未优化的代码时,这是一个毫无意义的练习。 如果启用优化,两者都需要 0.0s 学点东西也不是没有意义。我没有考虑到软件的编译是 32 位的,我马上意识到这是一个问题。我对使用 g++ 进行优化也很陌生,zch 你能详细说明或指出正确的方向吗? 你问题中的代码不是C。 谁修复了这个差异(标签)谢谢 【参考方案1】:

一些可能的原因:

一般而言,较大的数据类型需要更多的内存带宽 即使循环计数器保存在寄存器中,CPU 也可能会花费更多时间来执行大值的计算,尤其是在需要多个寄存器时(例如,如果您的 CPU 只有 32 位宽的寄存器) 编译器需要发出额外的机器指令来模拟 CPU 不直接支持的任何类型 这也取决于优化。这种没有副作用的循环可以完全优化出来,不管int number;(可能只是for(T d=0;d&lt;4294967295u;d++);

您可以通过提供一些程序集来继续您的调查/练习。

【讨论】:

我无法识别 g++ 编译将是 32 位,无论我在哪个平台上进行编译。我还不知道如何指定 64 位构建(仍在学习 gcc/g++) 但我确实对你的第一个子弹有疑问。如果我错了,请纠正我,但如果它被编译为作为 64 位应用程序运行,那么变量是 uint32_t 还是 uint64_t 都没有关系,因为无论哪种方式,传递的带宽都将始终是 64 位 在 64 位平台上,它应该默认为 64 位。但是,您可以传递以下编译器参数:-m32-m64。平台的位宽主要指定可用的地址空间,而不是值。然而,为了有效地处理地址,也有相应的寄存器。 int 可以是 32 位或 64 位,而具有显式宽度的 C99 类型没有变化。 @Parad0x13 x86-64 64 位指令集允许直接操作 32 位寄存器,并且操作码比 64 位寄存器短。 另一个相关问题:***.com/q/8948918/1175253 | AMD64 寄存器布局:en.wikipedia.org/wiki/X86-64#Architectural_features

以上是关于为啥 uint32_t 与 uint64_t 速度不同?的主要内容,如果未能解决你的问题,请参考以下文章

从uint32_t [16]数组到uint32_t变量序列的64位副本

uint8_t / uint16_t / uint32_t /uint64_t数据类型详解

uint8_t / uint16_t / uint32_t /uint64_t 是什么数据类型 - 大总结

uint8_t / uint16_t / uint32_t /uint64_t 这些数据类型是什么?

uint8_t / uint16_t / uint32_t /uint64_t 这些数据类型是什么?

uint8_t / uint16_t / uint32_t /uint64_t 是什么数据类型 - 大总结,看完全明白了