Ответ 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: мой тестовый код (работает немного медленнее, чем код без блокировок) на самом деле был на статических методах, похоже, что когда код запускается внутри объекта, тайминги одинаковы. Я исправил тайминги в соответствии с этим.