Clist的RemoveAll()函数速度很慢

photowen 2012-07-04 05:11:37
CList<CPoint,CPoint&> listPoint;

for (int i = 0; i < 500000; i ++)
{
listPoint.AddTail(CPoint(i,i));
}

listPoint.RemoveAll();

本人程序中用到大量数据,但是我用的是Clist存储,因为设计到修改插入某个数据,但是有时候又要清空链表,所以就用RemoveAll()函数,但是发现RemoveAll()函数速度很慢,例如上面的程序要四五秒的时间,那位有自己写的链表速度比较快的,并且使用上和clist一样给我发一个,不胜感激!邮箱photowen@163.com
...全文
263 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
wincehxd 2015-03-30
  • 打赏
  • 举报
回复
不知楼主是否找到了CList删除慢的解决方法,我也遇到了这个问题,我的链表里大概有1千万的数据,删除那叫一个慢啊,如果楼主有方法,请赐教
photowen 2012-07-06
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

如果插入和删除节点不是很频繁的话, 建议使用CArray
CList以链表的方式存储节点,因此插入和删除只需维护链表信息,而无需移动数据,但是寻址比较繁琐
CArray是以块方式存储节点,就类似于数组,寻址和全部释放的操作非常快,但是插入和删除将产生比较大的数量搬移问题,提高CArray插入的效率的方式就是先分配一个较大的空间,然后再操作

可以对比下运行速度
C/C++ code
……
[/Quote]

谢谢!
photowen 2012-07-06
  • 打赏
  • 举报
回复
谢谢大家的积极响应,特别是1楼兄弟,的确CArray很快,这个我也测试过,但是我有很多的算法用的是CList改动起来很麻烦,另外有很多地方涉及到修改某个元素,所以不能用CArray,谢谢!
zgl7903 2012-07-05
  • 打赏
  • 举报
回复
我起初也是认为是多次for循环引起的时间长,但是测试结果却真是删除慢

DWORD dw1, dw2, dw3;
dw1 = GetTickCount();
CList<CPoint,CPoint&> listPoint;
for (int i = 0; i < 500000; i ++)
{
listPoint.AddTail(CPoint(i,i));
}
dw2 = GetTickCount();
listPoint.RemoveAll()
dw3 = GetTickCount();
TRACE(_T("T1=%ld T2=%ld\n"), dw2-dw1, dw3-dw2);


结果T1=328 T2=4195

于是我大概看了一下CList的实现代码,它插入的时候一次分配10个单元,这样后续的9个节点插入速度就很快, 而删除则是逐个进行的
傻X 2012-07-05
  • 打赏
  • 举报
回复
偶坚信RemoveAll的速度一定比你Add的快
  • 打赏
  • 举报
回复
慢是由for语句引起的并不是removeAll
zgl7903 2012-07-04
  • 打赏
  • 举报
回复
如果插入和删除节点不是很频繁的话, 建议使用CArray
CList以链表的方式存储节点,因此插入和删除只需维护链表信息,而无需移动数据,但是寻址比较繁琐
CArray是以块方式存储节点,就类似于数组,寻址和全部释放的操作非常快,但是插入和删除将产生比较大的数量搬移问题,提高CArray插入的效率的方式就是先分配一个较大的空间,然后再操作

可以对比下运行速度

{
CArray<POINT,POINT&> listPoint;
listPoint.SetSize(500000);
DWORD dw1, dw2, dw3;
dw1 = GetTickCount();
for (int i = 0; i < 500000; i ++)
{
POINT pt ={i, i};
listPoint[i] = pt;
}
dw2 = GetTickCount();
listPoint.RemoveAll();
dw3 = GetTickCount();

TRACE(_T("T1=%ld T2=%ld\n"), dw2-dw1, dw3-dw2);
}

16,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧