Works by

Ren's blog

@rennnosuke_rk 技術ブログです

【C++】vectorと生配列の速度比較

STLライブラリ上の動的配列'vector'と生配列のアクセス速度比較メモ。vectorはat()アクセスでなければ十分高速とのことなのですが、そうはいっても生配列と比べたら流石に遅かろうと思い、実験してみました。


#include<iostream>
#include<vector>

int main(){
    
    int length = 10000000;
    
    std::vector<float> v(length, 0);
    float *array = new float[length];
    
    time_t start = clock();
    
    for (int i = 0; i < length; ++i) {
        array[i] = 5;
    }
    
    std::cout << "raw : " << clock() - start  << "μs"<< std::endl;
 
    start = clock();
    
    for (int i = 0; i < length; ++i) {
        v[i] = 5;
    }
    
    std::cout << "vector : " << clock() - start  << "μs"<< std::endl;
 
}

生配列とvectorをそれぞれ同じ長さで用意し、各々の要素に定数を格納していきます。 検証方法が初歩的かつ適当ですが、ご了承ください。。。

そして結果

まずは最適化無し(-O0)で

raw : 60103μs
vector : 48983μs

次に最適化オプションあり(-O3)で

raw : 51μs
vector : 4779μs

流石に生配列、最適化がかかると高速です。 一方で最適化前はvectorのほうが速いのですが、これが謎。 一応、双方とも要素がシーケンシャルに入っているようなので、ランダムアクセスとかはなさそうですが・・・

vector内部と最適化オプションの調査が必要みたいです。

(以下、要素アドレス確認のためのコード)

    int length = 10000000;
    
    std::vector<float> v(length, 0);
    float *array = new float[length];
    
    time_t start = clock();
    
    for (int i = 0; i < length; ++i) {
        std::cout << &array[i] << std::endl;
        if(i > 5)break;
    }
    
    std::cout << "raw : " << clock() - start  << "μs"<< std::endl;
 
    start = clock();
    
    for (int i = 0; i < length; ++i) {
        std::cout << &v[i] << std::endl;
        if(i > 5)break;
    }
    
    std::cout << "vector : " << clock() - start  << "μs"<< std::endl;
0x108c93000
0x108c93004
0x108c93008
0x108c9300c
0x108c93010
0x108c93014
0x108c93018
raw : 86μs
0x10666c000
0x10666c004
0x10666c008
0x10666c00c
0x10666c010
0x10666c014
0x10666c018
vector : 41μs