Я тестировал, как Interlocked.Increment
и lock
ведут себя на архитектуре моего компьютера, потому что я прочитал следующие строки в this article.Interlocked.Increment vs lock в debug vs mode mode
Как было переписано с помощью блокировки. Метод должен выполняться быстрее, по крайней мере, на некоторых архитектурах.
Используя следующий код, я убедился, что стоит рассмотреть блокировки в моих проектах.
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.4s для запирания и 1.2s для ВЗАИМОСВЯЗАННОГО. Однако я с удивлением обнаружил, что запуск этого кода в режиме освобождения улучшает значение только для блокировки приблизительно до 0,7 с, и время блокировки остается неизменным. Почему это? Как блокируется оптимизация, когда в режиме деблокирования блокировки нет?
Как правило, все измерения производительности должны выполняться только в режиме деблокирования. Измерения производительности режима отладки не актуальны. Прочитайте MSIL, предоставленный компилятором C#, возможно, код слишком оптимизирован (например, Interlocked заменяется на ++). –
Для незащищенной области блокировки требуются две взаимосвязанные инструкции. Показанные вами цифры показывают это идеально, по крайней мере, в режиме отладки. Кстати, ваш бенчмарк означает очень мало, потому что стоимость синхронизации зависит от конкуренции и ограничений в отношении кэш-линии. Ваш ориентир предполагает, что его нет. – usr
@usr Было бы здорово, если бы вы могли написать больше об этом и опубликовать его в качестве ответа. Я не понимаю MSIL, как предлагает Алекс, и с тех пор, как я прочитал всю статью, и это я до сих пор не понимаю полностью, более подробная информация по этой теме будет приветствоваться. –