配列と矩形配列

またしてもパフォーマンス測定。

using System;

class TheClass {
  const int LOOP = 20;
  [STAThread]
  static void Main(string args) {
    int width = 640;
    int height = 480;

    DateTime t;
    byte[,] data1 = new byte [height, width];
    byte data2 = new byte [height * width];

    // 矩形配列+GetLength()
    t = DateTime.Now;
    for (int k = 0; k < LOOP; ++k) {
      // GetLength()は遅いようだ
      for (int i = 0; i < data1.GetLength(0); ++i)
        for (int j = 0; j < data1.GetLength(1); ++j)
          data1[i, j] = 255;
    }
    Console.WriteLine(DateTime.Now - t);

    // 矩形配列+変数
    t = DateTime.Now;
    for (int k = 0; k < LOOP; ++k) {
      for (int i = 0; i < height; ++i)
        for (int j = 0; j < width; ++j)
          data1[i, j] = 255;
    }

    Console.WriteLine(DateTime.Now - t);

    // 配列(キャッシュなし)
    t = DateTime.Now;
    for (int k = 0; k < LOOP; ++k) {
      for (int i = 0; i < height; ++i) {
        // Debugだと遅いがReleaseだと最適化されて、キャッシュする必要がない
        for (int j = 0; j < width; ++j)
          data2[i * width + j] = 255;
      }
    }
    Console.WriteLine(DateTime.Now - t);

    // 配列(キャッシュあり)
    t = DateTime.Now;
    for (int k = 0; k < LOOP; ++k) {
      for (int i = 0; i < height; ++i) {
        // 値をキャッシュ
        int n = i * width;
        for (int j = 0; j < width; ++j)
          data2[n + j] = 255;
      }
    }
    Console.WriteLine(DateTime.Now - t);

  }
}

/* 結果
00:00:00.1250000
00:00:00.0781250
00:00:00.0156250
00:00:00.0156250 */

矩形配列は最適化しないで、まともにオフセット計算するみたい。うそーん・・・プログラム間違ってないですよね?(^^;