コンテナベンチマーク

いくつかのコンテナについて、アクセス時間を測定した。
92^4要素の頭から尻尾まで異なる値を代入するのにかかった時間を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
vector, 4重vector
A[raw] 0.644847
(&A[0])[raw] 0.689829
A[i][j][k][l] 0.758916

valarrayとvectorは似たようなもの。

…multi_array.data()[raw]が一番速いのはなんでだろ