std::deque vs Deque
Table of Contents

概要

本文比较std:deque(使用系统默认的deque实现及标准内存分配器)和Deque(使用sgi stl的deque,并且内存分配器为std::ScopeAlloc)。

测试环境

CPU:1.66 G (2CPUs)
操作系统:Windows XP
编译器:Visual C++ 6.0
优化选项:Maximize speed(最大速度)
C库:Multithreaded DLL
配置:Release版本

对比

测试程序(参见<stdext/Deque.h>):

template <class LogT>
class TestAprPools : public TestCase
{
    WINX_TEST_SUITE(TestAprPools);
        WINX_TEST(testCompare);
    WINX_TEST_SUITE_END();
 
    enum { N = 40000 };
 
    void doStlDeque(LogT& log)
    {
        typedef std::deque<int> DequeT;
        log.print("===== std::deque =====\n");
        std::PerformanceCounter counter;
        {
            DequeT coll;
            for (int i = 0; i < N; ++i)
                coll.push_back(i);
        }
        counter.trace(log);
    }
 
    void doDeque(LogT& log)
    {
        typedef NS_STDEXT::Deque<int> DequeT;
        log.print("===== Deque (ScopeAlloc) =====\n");
        std::PerformanceCounter counter;
        {
            NS_STDEXT::BlockPool recycle;
            NS_STDEXT::ScopeAlloc alloc(recycle);
            DequeT coll(alloc);
            for (int i = 0; i < N; ++i)
                coll.push_back(i);
        }
        counter.trace(log);
    }
 
    void doShareAllocDeque(LogT& log)
    {
        typedef NS_STDEXT::Deque<int> DequeT;
        NS_STDEXT::BlockPool recycle;
        log.newline();
        for (int i = 0; i < 5; ++i)
        {
            log.print("===== doShareAllocDeque =====\n");
            NS_STDEXT::PerformanceCounter counter;
            {
                NS_STDEXT::ScopeAlloc alloc(recycle);
                DequeT coll(alloc);
                for (int i = 0; i < N; ++i)
                    coll.push_back(i);
            }
            counter.trace(log);
        }
    }
 
    void testCompare(LogT& log)
    {
        for (int i = 0; i < 5; ++i)
        {
            log.newline();
            doStlDeque(log);
            doDeque(log);
        }
        doShareAllocDeque(log);
    }
};

测试结果:

===== std::deque =====
---> Elapse 1867 ticks (0.52 ms) (0.00 min) ...
===== Deque (ScopeAlloc) =====
---> Elapse 1075 ticks (0.30 ms) (0.00 min) ...

===== std::deque =====
---> Elapse 1687 ticks (0.47 ms) (0.00 min) ...
===== Deque (ScopeAlloc) =====
---> Elapse 1061 ticks (0.30 ms) (0.00 min) ...

===== std::deque =====
---> Elapse 1658 ticks (0.46 ms) (0.00 min) ...
===== Deque (ScopeAlloc) =====
---> Elapse 1100 ticks (0.31 ms) (0.00 min) ...

===== std::deque =====
---> Elapse 1691 ticks (0.47 ms) (0.00 min) ...
===== Deque (ScopeAlloc) =====
---> Elapse 1051 ticks (0.29 ms) (0.00 min) ...

===== std::deque =====
---> Elapse 1663 ticks (0.46 ms) (0.00 min) ...
===== Deque (ScopeAlloc) =====
---> Elapse 1058 ticks (0.30 ms) (0.00 min) ...

===== doShareAllocDeque =====
---> Elapse 1060 ticks (0.30 ms) (0.00 min) ...
===== doShareAllocDeque =====
---> Elapse 657 ticks (0.18 ms) (0.00 min) ...
===== doShareAllocDeque =====
---> Elapse 656 ticks (0.18 ms) (0.00 min) ...
===== doShareAllocDeque =====
---> Elapse 656 ticks (0.18 ms) (0.00 min) ...
===== doShareAllocDeque =====
---> Elapse 656 ticks (0.18 ms) (0.00 min) ...
Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License