どせいたんさき。

ナスダヨー

Octave の計算速度比較テスト

とりあえず大学のマシンでテスト.とりあえず要素数 100,000 のベクトルに対して for ループを回した場合, arrayfun() を使った場合とそのまま計算した場合で比較.それぞれ以下のとおり.

octave> arr = rand(1e5,1);

octave> tic(); for k=1:1e5; sin(arr(k)); endfor; toc()
Elapsed time is 1.64 seconds.

octave> tic(); arrayfun(@sin,arr); toc()
Elapsed time is 0.65 seconds.

octave> tic(); sin(arr); toc()
Elapsed time is 0.00821 seconds.

arrayfun() は for ループよりは早いけどオーダーで高速化はできない.

とりあえず 10^n (n=1..6) で同様のことをしてどれだけ計算量と計算速度の推移をグラフにしてみた.横軸が要素数対数で縦軸が所要時間の対数.n=1 のときはほとんど変わらないんだけど,これはもしかしたら初期化とかで最初だけ時間がかかっているせいかもしれない.
結論:for ループも arrayfun() も遅い.



プロットに使ったデータは以下.誤差は 5-10% くらいあると思う.

## for loop
Elapsed time is 0.00132 seconds.
Elapsed time is 0.00159 seconds.
Elapsed time is 0.0197 seconds.
Elapsed time is 0.178 seconds.
Elapsed time is 1.7 seconds.
Elapsed time is 18.3 seconds.

## arrayfun()
Elapsed time is 0.00185 seconds.
Elapsed time is 0.0012 seconds.
Elapsed time is 0.00625 seconds.
Elapsed time is 0.0734 seconds.
Elapsed time is 0.629 seconds.
Elapsed time is 6.93 seconds.

## direct
Elapsed time is 0.00111 seconds.
Elapsed time is 3.11e-05 seconds.
Elapsed time is 8.6e-05 seconds.
Elapsed time is 0.000689 seconds.
Elapsed time is 0.0108 seconds.
Elapsed time is 0.0768 seconds.