ConcurrentDictionary.Values ​​против циклического перебора KeyValuePairsC#

Место общения программистов C#
Anonymous
ConcurrentDictionary.Values ​​против циклического перебора KeyValuePairs

Сообщение Anonymous »

Код: Выделить всё

ConcurrentDictionary.Values
использует внутреннюю блокировку для получения данных из словаря, в то время как цикл непосредственно через словарь не использует никаких блокировок, но вы получаете саму KeyValuePair, поэтому вам придется вызывать .Value > для каждого результата.
Запуск инструмента использования ЦП VSDiagnostics. Часть информации, которую он рекомендовал для моего настольного приложения, заключалась в том, что также появлялся вызов .Values. часто. В частности, сообщение было

Изображение
Для тех, кто не умеет читать изображение (и/или не знают о разделе «Основная информация» в Diagsession). Есть две колонки. В первом столбце указано «Проблема»:

Код: Выделить всё

'System.Collections.Concurrent.ConcurrentDictionary.get_Values()' exceeded
CPU Threshold of 0.01%.
А во втором столбце указано описание проблемы и написано

Код: Выделить всё

0.05% of CPU time is spent in System.Collections.Concurrent.ConcurrentDictionary.get_Values(). ConcurrentDictionary.Values takes a lock and makes a copy. Enumerate KeyValuePairs for efficient access to values and avoid using inside loops
В разделе «Проблема» также имеется ссылка на здесь
Так что мне интересно, заменю ли я его циклом через KeyValuePair< /code> и вызов .Value действительно ли это улучшит загрузку ЦП или просто скроет проблему, поскольку теперь это будет не один вызов, который занимает все время, а несколько небольших, занимающих один и тот же объем времени, но поскольку все они будут меньше, это не будет отмечено?
Две версии, которые сейчас у меня под рукой, По данным профилировщика, мне следует использовать вторую версию, но я не уверен насчет потокобезопасности

Подробнее здесь: https://stackoverflow.com/questions/785 ... valuepairs

Вернуться в «C#»