我想问一个可以概括为一个句子的问题:
使用
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>
使用更多的内存),我也想听听。
非常感谢您!