for文にGetLengthはキケン?

for文の条件式

for文の条件式

条件式は何使う?

今回なぜこのテーマにしたのかというと、前回「多次元配列とfor文」についてまとめたのですが、6種類の3重ループを作成しました。このとき配列の要素数を変えるたびに6×3=18箇所の修正を行うのは大変です。そのためfor文の条件式を「x.GetLength()」を使って実行しようと思ったのですが、条件式を数字からGetLengthに変更したとたん急に処理時間が長くなってしまったのです。
ということ今回は「for文の条件式」についてまとめみようと思います。


処理時間の差は?

それでは、条件式が数字のfor文メソッドのfor文の2種類のコードを作成し、速度に差が出るのか調べてみようと思います。
処理するものは前回に引き続き行列の積にします。

 for(int i=0;i<n;i++)
 {
     for(int w=0;w<n;w++)
     {
         for(int v=0;v<n;v++)
         {
             data[i,w] += x[i,w] * x[w,v];
         }
     }
 }
        
上記コードの n の部分を数字メソッドに変更します。
配列は1000×1000です。
  • 数字のfor文
  •  for(int i=0;i<1000;i++)
     {
         for(int w=0;w<1000;w++)
         {
             for(int v=0;v<1000;v++)
             {
                 data[i,w] += x[i,w] * x[w,v];
             }
         }
     }                   
                    

  • メソッドのfor文
  •  for(int i=0;i<x.GetLength(1);i++)
     {
         for(int w=0;w<x.GetLength(0);w++)
         {
             for(int v=0;v<x.GetLength(0);v++)
             {
                 data[i,w] += x[i,w] * x[w,v];
             }
         }
     }            
                    

これらのコードを実行すると、以下のような処理時間となります。
ちなみに、Test1数字Test2メソッドとなります。
このように、同じ処理であっても時間に差が生じるのですね。しかも、今回の環境では4秒も差が出てしまっています。
ちなみに、前回の実験において条件式をメソッドにした場合は一番処理時間が短かった組み合わせであっても1分以上結果が出ませんでした。
処理時間が長くなってしまう組み合わせでメソッドを使用した場合は数十分かかるかも知れませんね。


なぜ差が生じる?

正直私には詳しいところはわかりません。
おそらく、条件式を判定する際にGetLengthメソッドを複数回呼び出すためではないかと思います。やはり数字を参照するよりもメソッドを呼び出す方が時間がかかるのですかね。
この辺が分かる人がいたら是非教えていただきたいです。


まとめ

ということで今回は、for文の条件式についてまとめました。
原因までは調べきることができませんでしたが、ループ回数を重ねる時には注意が必要であることは分かりました。
実際、配列の要素数が定まっていないときに毎回修正するのは大変です。だから、私は基本的にGetLengthを使っちゃうんですよね。
あらかじめループ回数が分かっているときには条件式を数字、メソッドなどで事前に判断できないときには条件式をメソッドにするのがいいかもしれませんね。
もう少し中身の仕組みとかも分かるようになると面白いかもしれないですね。勉強しなくては!
では今回はこの辺で、ではまた!

コメント

このブログの人気の投稿

PowerAppsで座席表を作成する

Power AutomateでTeamsのキーワードをトリガーにする

Power Automateで文字列抽出