gpt4 book ai didi

C++:std::vector 与 std::list 的性能

转载 作者:太空宇宙 更新时间:2023-11-04 12:53:07 25 4
gpt4 key购买 nike

<分区>

我有以下代码来分析各种 N 的 std::vector 性能与 std::list 的对比。

void vectorPerf(size_t n)
{
std::chrono::high_resolution_clock::time_point t1 = std::chrono::high_resolution_clock::now();
std::vector<size_t> cache;
for (size_t i = 0; i < n; i++) {
cache.push_back(i);
}
std::chrono::high_resolution_clock::time_point t2 = std::chrono::high_resolution_clock::now();

auto duration = std::chrono::duration_cast<std::chrono::microseconds>(t2-t1).count();

std::cout << duration << " us." << "\n";

return;
}

void listPerf(size_t n)
{
std::chrono::high_resolution_clock::time_point t1 = std::chrono::high_resolution_clock::now();
std::list<size_t> cache;
for (size_t i = 0; i < n; i++) {
cache.push_back(i);
}
std::chrono::high_resolution_clock::time_point t2 = std::chrono::high_resolution_clock::now();

auto duration = std::chrono::duration_cast<std::chrono::microseconds>(t2-t1).count();

std::cout << duration << " us." << "\n";

return;
}

int main(int argc, char** argv)
{

if (argc != 2) {
return -1;
}
std::stringstream ss(argv[1]);
size_t n;
ss >> n;
vectorPerf(n);
std::cout << "\n";
listPerf(n);
std::cout << "\n";
}

对于同一组 N 的多次运行,我得到的结果与以下数字的顺序一致:

N       std::vector  std::list
1000 46 116
2000 85 217
5000 196 575
10000 420 1215
100000 3188 10497
1000000 34489 114330

我想知道的是,为什么 std::list 的性能一直比 std::vector 差。对于 std::vector,我预计性能会分摊 O(N),因为支持 std::vector 的内部对象需要不时调整大小。因为我所做的只是将一个元素插入到列表的末尾,所以我希望 std::list 为 O(1)。所以这表明 std::list 会比 std::vector 做得更好,但事实似乎恰恰相反。

如果有人能阐明发生这种情况的原因,我将不胜感激。我正在 MacOS 10.12.6 上使用 g++ 在 2015 MBP 上进行编译。

谢谢。

编辑:我现在明白 std::vector::push_back() 是分期 O(1) 的。然而,我不清楚的是为什么 std::list::push_back() 的性能始终比 std::vector::push_back() 差?

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com