付録2.3 2次元配列、でも遅い |
当初、2次元配列の書き方が分からず、1次元の配列で列数と行数を乗じた値をインデックス値としてアクセスしていました。入門書やWebでのJavaScript解説ページを見ても2次元配列のことは載ってないようです。まあ、一般的にはJavaScriptで2次元配列を使うシーンも無いとは思いますが。以下のように書けば、2次元配列が使えます。でもこれが正しい書き方かどうかは分かりません。
2次元配列の書き方 // 2次元配列の定義 board = new Array(10); for (i=0;i<10;i++) { board[i] = new Array(10); } // 2次元配列のアクセス方法例 board[0][0] = 0;
しかし、ペントミノを解くJavaScriptを1次元配列から2次元配列に書き直してみると、どうも解く速度が遅くなった気がしました。そこで、以下のような速度比較をしてみたところ、確かに1〜2割程度遅いようです。しかし、ソースの読みやすさを考えてペントミノのソースは2次元配列にしてあります。
1次元配列と2次元配列の速度比較 (a) 2次元配列 (b) 1次元配列 (a) / (b) NC 4.06 7.1秒 6.3秒 1.13 IE 3.04 7.4秒 5.8秒 1.27 ソース // 2次元配列の定義 board = new Array(10); for (i=0;i<10;i++) { board[i] = new Array(10); } // 2次元配列の初期化 for (k=0;k<1000;k++) { for (i=0;i<10;i++) { for (j=0;j<10;j++) { board[i][j] = 0; } } } // 2次元配列を1次元として定義 var x = 10, y = 10; board = new Array(x*y); // 配列の初期化 for (k=0;k<1000;k++) { for (i=0;i<10;i++) { for (j=0;j<10;j++) { board[i*y+j] = 0; } } }-
- 配列全体の初期化を1000回実行した時間(ソースのkのループ)
- 実行マシンはPentium100MHzのノートパソコン
- 5回程度実行した平均時間(時間測定は以下のソース)
function now_time () { var now = new Date(); return now.getTime() } function test() { var now = now_time(); ここに測定対象のソースを埋め込む document.write(now_time()-now,"[msec]<BR>"); document.close(); }
Copyright (C) Nakamura 1999 |