放弃不切实际幻想吧,list 就一定比 vector 插的快?

网友投稿 746 2022-05-29

@[toc]

一段对话

如果 list 真那么好,你自己用吗?

用啊,我当然用啦。

放弃不切实际的幻想吧,list 就一定比 vector 插的快?

你用的是STL的吗?还是自己写的list?

自己写的。

为什么不用STL的,是它写的没你好?

它是双向链表,我就偶尔用用,自己又不是不会写。

尾插数据测试

//#include #include #include #include using namespace std; int main() { clock_t startTime, endTime; startTime = clock();//计时开始 //vector vec; list list_; for (int i = 0; i < 30000000; i++) //vector试过二十多亿,到后面直接崩了,估计是hold不住,而且好久 { //空跑的速度在0.001~0.004之间,无妨 //vec.push_back(i); //vec.emplace_back(i); //emplace_back:在容器尾部添加一个元素,这个元素原地构造,不需要触发拷贝构造和转移构造。 //list_.push_back(i); //1亿直接崩盘,52秒 //1千万,12秒,622M内存,跟飞一样。上面1亿也才九百多M内存 //上面vector,3千万,12.5秒,253M内存,高下立判 } endTime = clock();//计时结束 cout << "The run time is: " << (double)(endTime - startTime) / CLOCKS_PER_SEC << "s" << endl; system("pause"); return 0; }

自己测测,把注释该放出来的放出来。数据我基本收走了,要数据自己动手,留下点印象也是好的。

头插数据测试

//#include #include #include #include using namespace std; int main() { clock_t startTime, endTime; startTime = clock();//计时开始 //vector vec; list list_; for (int i = 0; i < 30000000; i++) //vector试过二十多亿,到后面直接崩了,估计是hold不住,而且好久 { //空跑的速度在0.001~0.004之间,无妨 /*vec.insert(vec.begin(), i); cout << i << endl;*/ //头插就开始乌龟爬了 list_.insert(list_.begin(), i); //80s,1.8G,尾插的时候只要36秒呢,看来list也不是在哪里插都是一个速度啊,但是好歹比vector要快了 //我突然有点明白nginx为什么要那样设计ngx_array了 //1千万,12秒,622M内存,跟飞一样。上面1亿也才九百多M内存 //上面vector,3千万,12.5秒,253M内存,高下立判 } endTime = clock();//计时结束 cout << "The run time is: " << (double)(endTime - startTime) / CLOCKS_PER_SEC << "s" << endl; system("pause"); return 0; }

得出结论

1、VS进程内存是有限的哈,或者说,进程能分配到的内存应该是有上限的,不然还得了?

一个进程能使用的内存在2G左右波动,VS测试到2.2的时候没了,网上都说只给2G,可以自己调哈。所以我说,2G左右嘛。

2、list消耗内存,这个嘛,说真的,我一直觉得 list 的内存消耗是会在vector 的3倍,毕竟双向链表嘛。

但是一下高了8倍我也不知道为啥了。

3、对于尾插,vector是真的有优势,其实也不难解释,list 插一个就要去找一块地址。

4、list 头插速度居然跟尾插速度不一样?!!!差了好几倍里面。。。

5、==我终于知道 nginx 为什么要那样设计 ngx_list 了==。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:聊一聊 bootstrap 的轮播图插件
下一篇:php必知必会的小知识 欢迎来读
相关文章