以下のプログラム (デバッガーを接続せずにリリース モードで実行) に非常に興味があります。最初のループは、配列の各要素に新しいオブジェクトを割り当て、実行に約 1 秒かかります。
そこで、オブジェクトの作成と代入のどの部分に最も時間がかかっているのだろうかと考えていました。そこで、オブジェクトの作成に必要な時間をテストするために 2 番目のループを作成し、割り当て時間をテストするために 3 番目のループを作成しました。どちらもわずか数ミリ秒で実行されます。どうしたの?
static class Program
{
const int Count = 10000000;
static void Main()
{
var objects = new object[Count];
var sw = new Stopwatch();
sw.Restart();
for (var i = 0; i < Count; i++)
{
objects[i] = new object();
}
sw.Stop();
Console.WriteLine(sw.ElapsedMilliseconds); // ~800 ms
sw.Restart();
object o = null;
for (var i = 0; i < Count; i++)
{
o = new object();
}
sw.Stop();
Console.WriteLine(sw.ElapsedMilliseconds); // ~ 40 ms
sw.Restart();
for (var i = 0; i < Count; i++)
{
objects[i] = o;
}
sw.Stop();
Console.WriteLine(sw.ElapsedMilliseconds); // ~ 50 ms
}
}