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