Я проверял, как Interlocked.Increment
и lock
ведут себя на архитектуре моего компьютера, потому что я прочитал следующие строки в эта статья.
Как переписано с Interlocked.Increment, метод должен выполняться быстрее, по крайней мере, на некоторых архитектурах.
Используя следующий код, я убеждаюсь, что стоит проверить блокировки в своих проектах.
var watch = new Stopwatch();
var locker = new object();
int counter = 0;
watch.Start();
for (int i = 0; i < 100000000; i++)
{
lock (locker)
{
counter++;
}
}
watch.Stop();
Console.WriteLine(watch.Elapsed.TotalSeconds);
watch.Reset();
counter = 0;
watch.Start();
for (int i = 0; i < 100000000; i++)
{
Interlocked.Increment(ref counter);
}
watch.Stop();
Console.WriteLine(watch.Elapsed.TotalSeconds);
Я получаю стабильные результаты с приблизительными значениями 2,4 с для блокировки и 1,2 с для блокировки. Однако я был удивлен, обнаружив, что запуск этого кода в деблокированном режиме улучшает значение только для Interlocked примерно до 0,7 с, а время блокировки остается прежним. Почему это? Как оптимизирован Interlocked, когда в режиме деблокирования блокировка не работает?