2016-10-19 7 views
0

私はこのループでコストを削減する方法を探しています。ボトルネックは、新しい項目を配列に追加するときに発生します。私は約実行しています。何千もの繰り返しがあるため、パフォーマンスの向上は、どれほど小さくても長い道のりになります。ループのパフォーマンスを向上させるのに役立つ必要があります

int[][] coordinates; 

public void RefactorCoordinates() 
{ 
    try 
    { 
     coordinates = new int[10000000][]; 
     int nextIndex = 0; 
     double width = OffsetWidth; 
     double height = OffsetHeight; 
     double depth = OffsetDepth; 
     for (int z = 0; z < width; ++z) 
     { 
      for (int y = 0; y < height; ++y) 
      { 
       for (int x = 0; x < depth; ++x) 
       { 
        coordinates[nextIndex] = new int[] { z, y, x }; 
        nextIndex++; 
       } 
      } 
     } 
     Array.Resize(ref coordinates, nextIndex); 
    } 
    catch(Exception ex) 
    { 
     ex.ToString(); 
    } 
} 
+0

時間の大部分、その後の配列のサイズ変更、またはループはどれくらいコストがかかりますか?あらかじめ合計サイズを計算するのが簡単ではないでしょうか(とにかく新しい座標を宣言していますか?)また、インデックスに基づいてz、y、xを計算できませんか?ちょうどいくつかのアイデアを投げて、実際に意図が何であるか分かりません – Icepickle

+0

アレイのサイズ変更は事実上無料です。新しい項目が配列に追加された行をコメントアウトすると、実行は瞬時に行われます。私は3つの整数値を受け取り、それらの値の各増分を表す新しいオブジェクトを作成しています。それはループの唯一の機能です – Jace

+0

辞書に2次元配列を置き換えるのはどうですか?それはプログラミングロジックの残りの部分に依存します。 – Prisoner

答えて

0

パフォーマンスの問題の多くは、配列ではなく構造体を使ってデータを表現することで軽減されることが分かりました。なぜこれが速いのか分かりませんが、何があっても。

+0

多次元配列を使用することをお勧めします: 'int [、] coordiantes = new int [10000 、3]。あなたが見るスピードアップはメモリ割り当てによるものです。構造体のサイズが固定されているため、配列の初期化では1ブロックのメモリを割り当てることができます。 – ReneA

+0

情報ありがとう – Jace

関連する問題