Мне интересно, как часть заблокированного кода может замедлить мой код, даже если код никогда не выполняется. Ниже приведен пример:
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 мс на моей машине. Если мы удалим блокирующий блок (но сохраним его тело), получим 750 мс. Почти двойной, даже если код никогда не запускается!
Конечно, этот код ничего не делает. Я заметил это, добавив некоторую ленивую инициализацию в класс, где код проверяет, инициализирован ли объект и если он не инициализирует его. Проблема в том, что инициализация заблокирована и замедляет все даже после первого вызова.
Мои вопросы:
- Почему это происходит?
- Как избежать замедления