トップ >
メモリジャンプと高速化 >
2次元配列 > Sample 1: 2次元配列への代入(JScript)
2次元配列: Sample 1: 2次元配列への代入(JScript)
■ 概要
このサンプルでは正方マトリックスに値を単に代入するという非常に単純なプログラムを示します。ここでは2重ループを使って値を代入します。ループの順番から考えると、以下の2通りのコーディングの仕方があります。Code 1では内側ループ(ループj)はマトリックスの行(第1の指数)に関連付けられます。一方、Code 2では列(第2の指数)に関連付けられます。
これらのコードは本ページに埋め込んでありますので、コードの下のフォームにサイズnを入力し実行ボタンを押すと、これらのコードを実際に実行できます。そして計算にかかった時間は表示されますので、どのコードがどれぐらい速いか体験できます。
■ ソースコード
◆ Code 1
|
◆ Code 2
|
/*
Function to measure time to initialize a nxn matrix to a value.
a(i,j) = 1 for i=1,...,n, and j=1,...,n.
*/
function ex1(n)
{
// Allocation
a = new Array(n);
for (i=0; i<n; i++)
a[i] = new Array(n);
// Start time
time0 = new Date();
// Main calculation: initialization
for (i=0; i<n; i++)
for (j=0; j<n; j++)
a[j][i] = 1;
// Finish time
time1 = new Date();
// Computational time (sec)
time = 0.001 * (time1 - time0);
return time;
}
|
/*
Function to measure time to initialize a nxn matrix to a value.
a(i,j) = 1 for i=1,...,n, and j=1,...,n.
*/
function ex2(n)
{
// Allocation
a = new Array(n);
for (i=0; i<n; i++)
a[i] = new Array(n);
// Start time
time0 = new Date();
// Main calculation: initialization
for (i=0; i<n; i++)
for (j=0; j<n; j++)
a[i][j] = 1;
// Finish time
time1 = new Date();
// Computational time (sec)
time = 0.001 * (time1 - time0);
return time;
}
|
上のJScriptコードを実行してみよう! |
|
|
■ 考察
JScript言語ではC言語と同様に2次元配列を行単位で1次元配列に組みなおされるので、内側のループが列に関連付けられたCode 1は図2のように飛び飛びしたメモリアクセスになります。一方、内側のループが行に関連付けられたCode 2は図3のように連続したメモリアクセスになります。上のフォームを使ってCode 1よりCode 2の方が速いことをご確認してみてください。