コンテナベンチマーク
いくつかのコンテナについて、アクセス時間を測定した。
要素の頭から尻尾まで異なる値を代入するのにかかった時間を64回計測し、中央値を採用。
Ubuntu 10.04 (LTS) 64bit, Core i7-960, g++ 4.4.3, -O3
multi_array
秒 | |
---|---|
A.data()[raw] | 0.585003 |
A[i][j][k][l] | 0.688783 |
A[j][i][k][l] | 0.727693 |
A[k][j][i][l] | 0.78196 |
A[l][k][j][i] | 2.3746 |
A.data()[((i*d+j)*h+k)*w+l] | 0.690925 |
A.data()[((l*d+k)*h+j)*w+i] | 2.3912 |
A.data()[((l*d+j)*h+k)*w+i] | 2.35292 |
さすがに1変数で回すのが最も速い。4変数で回す場合、自前のアドレス計算でもmulti_array任せでも同じ。forループはi,j,k,lの順に回している。アクセスがメモリ上連続になるようにforループを組んでおかないと、かなり性能が落ちているのが分かる。
ちなみに最適化無しだと A.data()[raw] が0.87秒、A[i][j][k][l]が12秒。
vector >
秒 | |
---|---|
A[i].data()[j] | 0.725252 |
A[i][j][k][l] | 1.0169 |
multi_arrayをvectorでくるむと、少し遅い。それぞれ、1.24倍と1.48倍。
valarray, 4重valarray
秒 | |
---|---|
A[raw] | 0.656968 |
(&A[0])[raw] | 0.712089 |
A[i][j][k][l] | 0.750151 |