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 lista;
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://pwwzsj.com/article/pisjsh.html