コードが実行されていないにもかかわらず、ロックされたコードの一部がどのように私のコードを遅くすることができるのか疑問に思っています。以下に例を示します。
public void Test_PerformanceUnit()
{
Stopwatch sw = new Stopwatch();
sw.Start();
Random r = new Random();
for (int i = 0; i < 10000; i++)
{
testRand(r);
}
sw.Stop();
Console.WriteLine(sw.ElapsedTicks);
}
public object testRand(Random r)
{
if (r.Next(1) > 10)
{
lock(this) {
return null;
}
}
return r;
}
このコードは、私のマシンで 1300 ミリ秒以内に実行されます。ロック ブロックを削除すると (本体はそのまま)、750ms になります。コードが実行されることはありませんが、ほぼ 2 倍です。
もちろん、このコードは何もしません。コードがオブジェクトが初期化されているかどうかをチェックし、そうでない場合は初期化するクラスに遅延初期化を追加しているときに気づきました。問題は、初期化がロックされ、最初の呼び出しの後でもすべてが遅くなることです。
私の質問は次のとおりです。
- なぜこうなった?
- 速度低下を回避する方法