Подтвердить что ты не робот

Как избежать замедления из-за заблокированного кода?

Мне интересно, как часть заблокированного кода может замедлить мой код, даже если код никогда не выполняется. Ниже приведен пример:

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 мс. Почти двойной, даже если код никогда не запускается!

Конечно, этот код ничего не делает. Я заметил это, добавив некоторую ленивую инициализацию в класс, где код проверяет, инициализирован ли объект и если он не инициализирует его. Проблема в том, что инициализация заблокирована и замедляет все даже после первого вызова.

Мои вопросы:

  • Почему это происходит?
  • Как избежать замедления
4b9b3361

Ответ 1

О том, почему это происходит, это обсуждалось в комментариях: это связано с инициализацией try ... finally, сгенерированной lock.


И чтобы избежать этого замедления, вы можете извлечь функцию блокировки для нового метода, чтобы механизм блокировки был инициализирован только в том случае, если метод действительно вызван.

Я попробовал это с помощью этого простого кода:

public object testRand(Random r)
{
    if (r.Next(1) > 10)
    {
        return LockingFeature();
    }
    return r;
}

private object LockingFeature()
{
    lock (_lock)
    {
        return null;
    }
}

И вот мои времена (в тиках):

your code, no lock   : ~500
your code, with lock : ~1200
my code              : ~500

EDIT: мой тестовый код (работает немного медленнее, чем код без блокировок) на самом деле был на статических методах, похоже, что когда код запускается внутри объекта, тайминги одинаковы. Я исправил тайминги в соответствии с этим.