尝试了解 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 秒。
为什么会发生这种情况?
最佳答案
一些可能的原因:
- 一般来说,较大的数据类型需要更多的内存带宽
- 即使循环计数器保存在寄存器内,CPU 也可能会花费更多时间来进行大值计算,特别是在需要多个寄存器的情况下(例如,如果您的 CPU 只有 32 位宽的寄存器)
- 编译器需要发出额外的机器指令来模拟 CPU 不直接支持的任何类型
- 这还取决于优化。这样一个没有副作用的循环可以完全优化,无论
int number;
如何。 (可能只是for(T d=0;d<4294967295u;d++);
)
您可以通过提供一些程序集来继续您的调查/练习。
关于c++ - 为什么 uint32_t 与 uint64_t 速度差异?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20031684/