放弃不切实际的幻想吧,list 就一定比 vector 插的快?
List 一定 vector 放弃
2023-09-14 09:15:26 时间
一段对话
如果 list 真那么好,你自己用吗?
用啊,我当然用啦。
你用的是STL的吗?还是自己写的list?
自己写的。
为什么不用STL的,是它写的没你好?
它是双向链表,我就偶尔用用,自己又不是不会写。
尾插数据测试
//#include<vector>
#include<list>
#include<iostream>
#include<ctime>
using namespace std;
int main()
{
clock_t startTime, endTime;
startTime = clock();//计时开始
//vector<int> vec;
list<int> 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<vector>
#include<list>
#include<iostream>
#include<ctime>
using namespace std;
int main()
{
clock_t startTime, endTime;
startTime = clock();//计时开始
//vector<int> vec;
list<int> 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 了。
相关文章
- c语言list嵌套遍历「建议收藏」
- Java整型List能存字符串对象吗?
- django admin list_filter 显示外键字段
- 完美解决丨2. `TypeError: list indices must be integers or slices, not str`
- ORA-01026: multiple buffers of size > 4000 in the bind list ORACLE 报错 故障修复 远程处理
- ORA-14206: table is not subpartitioned by List or Range methods ORACLE 报错 故障修复 远程处理
- Linked List Cycle详解程序员
- Python去除list中的重复元素的最简单办法详解编程语言
- JSONArray数据转换成java List详解编程语言
- List、Map、Set 三个接口,存取元素时,各有什么特点详解编程语言
- Java List.clear()方法:从列表中移除所有元素
- Java List.removeAll()方法:从列表中移除所有元素
- 利用Redis实现List元素的排序(redis排序list)
- List头文件助力Linux内核开发(list.hlinux)
- 长度查看Redis List长度:简单有效(redis查看list)
- Redis存储列表数据的方法(redis存list)
- Redis如何清空List:技巧分享(redis清空list)
- Mastering List Operations in Redis: Tips and Tricks for Optimal Performance(redis操作list)
- Oracle中使用List命令查看表结构(list命令oracle)
- 以List的形式将数据插入Redis(把list插入redis)
- 简单快速修改Redis List技巧(修改redis的list)
- 利用Redis List实现强大的数据存储(使用redis list)
- 从Redis读取List数据简单又高效(从redis读取list)
- Redis自带数据结构List(redis自带list)
- Redis灵活的List储存功能(redis能储存list)