stl::list的size实现太有问题啦
这几天做一个程序,在遍历一个100万个数据的LIST的时候非常非常慢,我把可能出现消耗时间都打印出来了,死活都找不到消耗时间的地方在什么地方。
创新互联长期为1000+客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为辽阳县企业提供专业的网站设计、成都做网站,辽阳县网站改版等技术服务。拥有十余年丰富建站经验和众多成功案例,为您定制开发。
最后盯上了判断size()等于一个值的地方,因为就剩下这个地方了,就打上了时间,结果发现竟然就是此处。一个size方法竟然消耗了0.02秒。注释掉后就一切正常了。最后的解决办法只好我帮助它来计数。
写了个小程序,发现list的size果然消耗时间,不过幸运的是empty不消耗时间。
而最幸运的是最常用的map的size并不消耗时间。
有空看看源码吧,难道每次size都要从头计算一次吗?
#include
#include
#include
using namespace std;
void p1()
{
struct timeval start;
gettimeofday(&start, 0);
printf("%u,%u\n",start.tv_sec,start.tv_usec);
}
int main()
{
list
p1();
for(int i=0;i<10000;i++)
lista.push_back(1);
p1();
for(int i=0;i<1000;i++)
{
lista.size();
lista.pop_front();
}
p1();
for(int i=0;i<1000;i++)
lista.pop_front();
p1();
return 0;
}
结果:
1238513193,693237
1238513193,695993
1238513193,795487
1238513193,795597
只是1W个数据就这样慢的,100W的数据更是慢的惊人。
--------------------------------------------------------------------
查了一下源码,果然是每次重新计算的,难道就为了节省4字节的空间?
size_type size() const {
size_type __result = 0;
distance(begin(), end(), __result);
return __result;
}
网站名称:stl::list的size实现太有问题啦
当前路径:http://scjbc.cn/article/pisjsh.html