スポンサーリンク
スポンサーリンク

【Java高速化】ただのfor文でも、圧倒的速度差

まずは以下のプログラムを実行してみます。

(Main.java)

10000×10000の2次元配列「array」各要素に「10」を代入するだけのプログラムですが、「1個目」と「2個目」とでは、配列番号を指定する時に「i」と「j」の順番が逆になっています。

すると、計測結果で違いが生まれました。

結果

「1個目のループ」より「2個目のループ」にかかった時間が、圧倒的に多いことがわかります。

見習い

配列番号の指定を逆にしただけなのに何故?

管理人

単刀直入に言うと、原因は「メモリジャンプ」にあります。

メモリジャンプとは

先ほどのプログラムで登場した2次元配列ですが、プログラムを実行する時には1次元配列に直されます。

プログラミング言語によって違いはあいますが、今回使用したJava言語では、以下のように1次元配列に直されます。

この上で「1個目のループ」と「2個目のループ」をみていきます。

1個目のループの場合

1個目のループでは、このように「1〜15」までの数字を順番に辿っていきます。

2個目のループの場合

2個目のループでは、このように飛び飛びになってしまいます。

これはつまり、

この画像のように、余計なメモリジャンプが起きてしまっていることを意味します。

そうすることで無駄な処理が増え、速度パフォーマンスが著しく落ちてしまいます。

今回は10000×10000の2次元配列で計測したため、メモリジャンプが99999999(9が8つ)回起きたことになります。

そして、この99999999回のメモリジャンプによって、処理時間(ms)が「55」から「2480」、つまり約45倍の処理時間が生まれました。

なので、「for」文や「while」文といった、大量の処理を行うプログラムでは、メモリジャンプによる速度低下には気をつけなければなりません。

コメント