c++ - C++中size_t的性能

标签 c++ performance c++11 int size-t

我翻译了代码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/

相关文章:

c++ - 枚举缺失导致编译器出错

c++ - 如何散列 std::regex?

c++ - 是否可以在 C++ 中开发静态 for 循环?

c++ - 我们应该使用标准库中的异常类型吗?

c++ - 具有 mkl 后端的特征库的系数数组操作的性能

javascript - 我可以做些什么来减少 HTML 页面的加载时间?

Python/Numpy : Build 2D array without adding duplicate rows (for triangular mesh)

c++ - 如何从 QGraphicsItem 中的上下文菜单运行函数

c++ - 核心bada接口(interface)是否建立在对C++构造的不当使用上?

c++ - 如何使用 std::shared_ptr<void> 和另一种类型的 std::shared_ptr 进行函数重载?