这几天做一个程序,在遍历一个100万个数据的LIST的时候非常非常慢,我把可能出现消耗时间都打印出来了,死活都找不到消耗时间的地方在什么地方。
最后盯上了判断size()等于一个值的地方,因为就剩下这个地方了,就打上了时间,结果发现竟然就是此处。一个size方法竟然消耗了0.02秒。注释掉后就一切正常了。最后的解决办法只好我帮助它来计数。
写了个小程序,发现list的size果然消耗时间,不过幸运的是empty不消耗时间。
而最幸运的是最常用的map的size并不消耗时间。
有空看看源码吧,难道每次size都要从头计算一次吗?
#include<list>
#include<sys/time.h>
#include<stdio.h>
using namespace std;
void p1()
{
struct timeval start;
gettimeofday(&start, 0);
printf("%u,%u\n",start.tv_sec,start.tv_usec);
}
int main()
{
list<int> 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;
}