stl::list的size实现太有问题啦-创新互联
这几天做一个程序,在遍历一个100万个数据的LIST的时候非常非常慢,我把可能出现消耗时间都打印出来了,死活都找不到消耗时间的地方在什么地方。
成都创新互联公司专注于郊区企业网站建设,成都响应式网站建设公司,成都商城网站开发。郊区网站建设公司,为郊区等地区提供建站服务。全流程按需设计网站,专业设计,全程项目跟踪,成都创新互联公司专业和态度为您提供的服务最后盯上了判断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;
}
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。
网页题目:stl::list的size实现太有问题啦-创新互联
当前网址:http://hbruida.cn/article/dhisch.html