使用`vector <bool>`与`vector <uint8_t>`的性能差异

时间:2019-03-17 13:50:31

标签: c++ performance

我想问一个可以概括为一个句子的问题:

  

使用vector<bool> slow )和使用vector<uint8_t> fast )之间的性能差异可能是什么解释? (与符合C ++ 17标准的g ++ 8.2 -O1编译)

这是全文。

它从LeetCode的Count Primes问题开始。计算小于n的素数。

一种解决方案是应用Eratosthenes筛,我将在下面列出其C ++代码。

但是,我有兴趣地注意到,只有一种差异-vector类型,在性能上存在一致的差距。即

| type            | runtime |  memory |
|-----------------|---------|---------|
| vector<bool>    | 68 ms   | 8.6  MB |
| vector<uint8_t> | 24 ms   | 11.5 MB |

完整代码是

class Solution
{
public:
    int countPrimes(int n)
    {
        // vector<uint8_t> isprime(n, true);
        vector<bool> isprime(n, true);
        int res = 0, root = std::sqrt(n);
        for (int i = 2; i < n; ++i) {
            if (isprime[i]) {
                ++res;
                if (i <= root)
                    for (int k = i * i; k < n; k += i)
                            isprime[k] = false;
            }
        }
        return res;
    }
};

LeetCode为C ++编译提供以下注释供您参考

  

使用最新的C ++ 17标准与g ++ 8.2一起编译。

     

您的代码使用第一级优化(-O1)进行编译。还启用了AddressSanitizer,以帮助检测越界和免费使用的错误。

     

为方便起见,大多数标准库头文件已自动包含在内。

我的问题是:以下观察结果的解释可能是:使用vector<bool>比使用vector<uint8_t>(24 ms,95%百分比)慢得多(68 ms,60%百分比) )?

我重复了10次以上的实验。内存使用率的差异也是一致的。如果您对此有任何解释(vector<uint8_t>vector<bool>使用更多的内存),我也想听听。

非常感谢您!

0 个答案:

没有答案