-Fortran- DOループの処理速度

DOループにおいて,ソースコードの書き方によってアクセスに要する時間が異なります.
 
整数型2次元配列のという"nteger(300090000)"各要素に,行番号(j)と列番号(k)の和を代入する例を用いて,計算処理速度の違いを比較してみます.
 
以下のプログラムの中で,組込み関数"date_and_time"は,計算処理時刻を知る内部服プログラムです.
 
PROGRAM TimeRace
IMPLICIT NONE
  CHARACTER:: date*8, time*10, zone*5   !Character data
  INTEGER::   nval(8)                   !Integer type
  INTEGER::   j, k
  INTEGER::   nteger(3000, 90000)
! Slow access example
  CALL date_and_time(date, time, zone, nval)
  WRITE(*,*)  time
    DO J=1, 3000
      DO k=1, 9000
        nteger(J, k)=j+k
      ENDDO
    ENDDO
  CALL date_and_time(date, time, zone, nval)
    WRITE(*,*) time
! Early access example
  DO k=1, 90000
    DO j=1, 3000
      nteger(J, k)=j+k
    ENDDO
  ENDDO
  CALL date_and_time(date, time, zone, nval)
    WRITE(*,*)  time
END PROGRAM TimeRace
 
このプログラムをコンパイルして実行すると,以下のようになります.
 
$ gfortran Timerace.f90
$ ./a.out
 095240.164
 095250.816
 095251.825
$ ./a.out
 095255.929
 095305.783
 095306.793
 
比較のために2回実行していますが,1回目の実行では,まず最初のDOループをスタートした時間
 095240164(9時52分40.164秒)
が表示され,続いて最初のDOループが終了した時間
 095250816(9時52分50.816秒)
が表示されます(最初のDOループでは,処理に約10秒かかっています).
続いて,2番目のDOループが終了した時間
 0952251.825(9時52分51.825秒)
が表示されます(2番目のDOループでは,処理に約1秒かかっています).
確認のための2回目の実行でも,1回目は約10秒,2回目は約1秒の処理時間です.
 
一般的に,外側ループの制御変数(配列の右側添字)をある値に固定したままで,内側ループにある制御変数(配列の左側添字)を変化させるようなDOループが効率的とされており,このことを確認することができました.

*配列について*
Fortran90/95における配列は,数学における行列と同じような並びとなります.
 
のような行列は,
 
となります.
すなわち,行列Aにおける1行2列成分(a_12)は,配列Aの1行2列成分(a(1, 2))と同じです.