STL里list、vector、queue性能差异与疑似内存泄漏问题

最近在项目中debug退出后,VS的Output面板会输出大量内存泄漏的信息。经过排查,居然发现是使用了std::list的原因!

然而通过MSDN上一些前辈的讨论,得知List并没有真正导致内存泄漏,而是VS本身的 _CrtDumpMemoryLeaks()函数的执行位置的问题。

具体可以参考如下文章:

http://social.msdn.microsoft.com/Forums/da-DK/vclanguage/thread/cfafbb87-d4fb-4c8a-a89c-36c9d0d0bfc6

奇怪的是,如果把list换成vector或者queue,所有内存泄漏的问题都消失了。

list的push_back的实现会导致内部使用大量动态内存分配,而vector也会在动态增长连续内存长度的同时进行内存复制。

那么在需要大量push_back的情况下究竟哪个性能会比较好?

于是我做了如下测试。我做的是一个图形程序,程序运行的帧数可以很好的展示性能。

测试环境:

VS2008,Win7 64位,Intel i7处理器。

测试代码很简单,在每一帧渲染代码中只填写如下代码:

    m_listTest.clear();
    for (int i = 0; i < 100000; ++i)
    {
        int iTest;
        m_listTest.push_back(iTest);
    }

在debug模式下:

当m_listTest类型为list时,程序FPS只能达到5.

m_listTest类型为vector时,程序FPS能达到20.

m_listTest类型为queue时,程序FPS能达到20.

现在给代码加上迭代器的遍历逻辑,看效率如何:

    m_listTest.clear();
    for (int i = 0; i < 100000; ++i)
    {
        int iTest;
        m_listTest.push_back(iTest);
    }
     for (list<int>::iterator it = m_listTest.begin(); it != m_listTest.end(); ++it)
     {
         int tets = *it;
     }

在debug模式下:

当m_listTest类型为list时,程序FPS只能达到4.

m_listTest类型为vector时,程序FPS能达到10.

queue没有迭代器,没有测试。

可见list在加上遍历逻辑后性能几乎没有受到影响,而vector性能降低到原来的一半。

那么如果vector采用随机访问的形式呢?代码如下:

    m_listTest.clear();
    for (int i = 0; i < 100000; ++i)
    {
        int iTest;
        m_listTest.push_back(iTest);
    }
     
    for (int it = 0; it < m_listTest.size(); ++it)
    {
        int tets = m_listTest[it];
    }
在debug模式下,当m_listTest类型为vector时,该代码能使程序FPS达到19.也就是说,相对于插入操作,下标遍历的性能消耗几乎可以无视。

这样的测试结果也很让我意外。我一直以为如果数据要做频繁的插入操作应该首选list。看起来queue是更好的选择。
是时候抛弃list了吗 ?...


评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值