C++
VisualStudio
DXライブラリ

STL vector・list全走査速度

自分用、ソースの説明は放棄

実行環境
OS:Windows 7 Home Premium
CPU:Core i7-2700K
RAM:16GB

検証クラス。

class cObj
{
private:
    bool m_Flag;
    double m_X, m_Y;
    double m_Angle, m_Speed;
    int m_Frame;

public:
    virtual bool Update()
    {
        m_Frame= Rand( 60, 120 );
        return false;
    }
    virtual void DrawProcess(){}
};

要素は65535個で回す、なんとなく

const int MAX_SIZE = 65535;

測定方法

    __int64 times;
    __int64 timeAvg = 0; 
    __int64 cntAvg = 0; 

    while( 1 )
    {
        times = GetNowHiPerformanceCount();

        // ***** ここに処理部分 *****

        times = GetNowHiPerformanceCount() - times;
        timeAvg += times;
        cntAvg ++;

        // 平均時間 = timeAvg / cntAvg;
    }

vector全走査

std::vector< cObj > m_Vec;
m_Vec.resize( MAX_SIZE );
    //  50.0ms
    for( auto it : m_Vec )
    {
        it.Update();
    }

    //  20.6ms
    for( auto &it : m_Vec )
    {
        it.Update();
    }

    //  19.6ms
    unsigned max = m_Vec.size();
    for( unsigned i=0 ; i<max ; i++ )
    {
        m_Vec[ i ].Update();
    }

    //  29.8ms
    for( unsigned i=0 ; i<m_Vec.size() ; i++ )
    {
        m_Vec[ i ].Update();
    }

    //  30.4ms
    for( unsigned i=0 ; i<m_Vec.size() ; i++ )
    {
        m_Vec.at( i ).Update();
    }

    //  54.6ms
    for( auto it=m_Vec.begin() ; it!=m_Vec.end() ; ++it )
    {
        it->Update();
    }

    //  24.6ms
    auto end = m_Vec.end();
    for( auto it=m_Vec.begin() ; it!=end ; ++it )
    {
        it->Update();
    }

list全走査

std::list< cObj > m_List( MAX_SIZE );
    //  51.2ms
    for( auto it : m_List )
    {
        it.Update();
    }

    //  21.9ms
    for( auto &it : m_List )
    {
        it.Update();
    }

    //  60.7ms
    for( auto it=m_List.begin() ; it!=m_List.end() ; ++it )
    {
        it->Update();
    }

    //  26.2ms
    auto end = m_List.end();
    for( auto it=m_List.begin() ; it!=end ; ++it )
    {
        it->Update();
    }

おまけ、forward_List全走査

listより軽いと思ってやったら全然重かった、ダメ

std::forward_list< cObj > m_fList( MAX_SIZE );
    //  55.7ms
    for( auto it : m_fList )
    {
        it.Update();
    }

    //  26.1ms
    for( auto &it : m_fList )
    {
        it.Update();
    }

    //  60.0ms
    for( auto it=m_fList.begin() ; it!=m_fList.end() ; ++it )
    {
        it->Update();
    }

    //  31.6ms
    auto end = m_fList.end();
    for( auto it=m_fList.begin() ; it!=end ; ++it )
    {
        it->Update();
    }

まとめ

endは重い
sizeも意外と重い
範囲forは&をつけないと重い

vectorが爆速かと思ってたけど、listも意外と悪くない