私はC#をかなり新しくしており、私のコードを最適化する助けが必要です。実行速度のdouble forループを最適化する
struct Data { public static int numberOfPixels; public static string[] filePaths; public static string[] fileNames; public static double[] z; public static int numberOfFrames; public static byte[][] imageBuffer; public static int bufferSize = 1000; public static double[] num; public static double[] den; } public class Methods { public void RetrieveFileList() { Console.WriteLine("Please enter the folder path where all measurement files are stored: "); Data.filePaths = Directory.GetFiles(Console.ReadLine(),"*.bin"); Data.fileNames = new string[Data.filePaths.Length]; Data.numberOfFrames = Data.filePaths.Length; Data.z = new double[Data.filePaths.Length]; int n = 0; foreach(string file in Data.filePaths) { Data.fileNames[n] = Path.GetFileNameWithoutExtension(file); n++; } } public void CreatePositionArray() { Console.WriteLine("Please enter the stepsize used during the scan in nanometers: "); double stepsize = Convert.ToDouble(Console.ReadLine()); int n = 0; foreach(string file in Data.fileNames) { Data.z[n] = Convert.ToInt32(file) * stepsize/1000; n++; } } public void InitializeBufferArray() { Data.imageBuffer = new byte[Data.numberOfFrames][]; } public byte[] ReadBinaryFile(int index) { return File.ReadAllBytes(Data.filePaths[index]); ; } public void FillImageBuffer() { for (int i = 0; i < Data.bufferSize; i++) { Data.imageBuffer[i] = ReadBinaryFile(i); } Data.numberOfPixels = Data.imageBuffer[0].Length; Data.num = new double[Data.numberOfPixels]; Data.den = new double[Data.numberOfPixels]; } } class Program { static void Main(string[] args) { Method.RetrieveFileList(); Method.CreatePositionArray(); Method.InitializeBufferArray(); Method.FillImageBuffer(); for(int i = 0; i < Data.numberOfFrames; i++) { for (int j = 0; j < Data.numberOfPixels; j++) { double der = Math.Pow(Data.imageBuffer[i+1][j] - Data.imageBuffer[i][j], 2); if (der < 1) der = 0; Data.num[j] = Data.num[j] + Data.z[i] * der; Data.den[j] = Data.den[j] + der; } } } }
私の主な方法で具体的に二つのループ。現在、このループは約1210000ピクセルの約1000フレームを処理します。外部ループの1回の反復には約80msの実行が必要です。 ここにはどのような方法がありますか? 複数のスレッドを作成し、私のバッファを定義済みのジャンクに分割するか、Parallelクラスを使用しますか? 私はどんな助けにも感謝します。
ありがとうございました。
これはまったく機能しますか? 'Data.imageBuffer [i + 1]'は 'IndexOutOfRangeException'のように聞こえます。 –