我翻译了代码here如下所示转换为 C++
#include <iostream>
using namespace std;
int t = 20;
bool is_evenly_divisible(const int a, const int b) {
for (int i=2; i<=b; ++i) { // Line 1
if (a%i != 0)
return false;
}
return true;
}
void run() {
int i = 10;
while (!is_evenly_divisible(i, t)) {
i += 2;
}
cout << i << endl;
}
int main(int argc, char** argv) {
run();
return 0;
}
在 Mac OSX 10.8.4 上的编译器 g++ 4.8.1 上使用 -O3 标志,我得到时间 0.568s 用户时间。
现在,如果我将函数 is_evenly_divisible 中第 1 行的计数器 i 更改为 size_t,时间会突然跳到 1.588s。 即使我将所有变量都更改为 size_t,这种情况仍然存在,时间增加到 1.646s
这是怎么回事? size_t 不应该提高性能而不是降低性能,因为它是比 int 更具体的类型吗?
最佳答案
int
通常是最快的全能类型。此属性不是标准强制要求的,但通常是当今平台的情况。我们还有像 cstdint 的 int_fast32_t
这样的东西,它更恰本地保证是最快的类型,至少可以容纳 32 位——强烈推荐它们用于对性能敏感的代码!
size_t
并非旨在提供快速整数。它的目的是提供一个整数,可以容纳您平台的地址空间可以包含的最大对象的大小。通常,size_t
相当于您的 CPU 支持的最大“ native ”整数,但并非必须如此。
我猜测您使用的是 64 位平台。通常 64 位平台对 32 位和 64 位操作的性能大致相同,但您遇到了它们通常不具备的一个地方:div/mod 在 64 位整数上实际上可能慢 2-3 倍.在这种情况下,如果 int
是 32 位并且 size_t
是 64 位,它很好地解释了这个问题。
参见 Agner Fog's指令表文档以获取更多信息。对于 Intel 的 Sandy Bridge 平台,它显示 32 位 div 有 20-28 个周期的延迟,而 64 位 div 需要 30-94 个周期。
关于c++ - C++中size_t的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17384606/