配列と矩形配列
またしてもパフォーマンス測定。
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 */
矩形配列は最適化しないで、まともにオフセット計算するみたい。うそーん・・・プログラム間違ってないですよね?(^^;