Кешируют ли одновременные коллекции снимки перечислителя? - PullRequest
0 голосов
/ 27 ноября 2018

Если я правильно понял, тогда параллельные коллекции создают снимок в качестве источника для Enumerator, используемого в цикле foreach, который требует блокировки.

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

Спасибо!

1 Ответ

0 голосов
/ 27 ноября 2018

Нет, это не похоже на кеширование.Вот код из ConcurrentBag<T>:

public IEnumerator<T> GetEnumerator()
{
    if (m_headList != null)
    {
        bool lockTaken = false;
        try
        {
            FreezeBag(ref lockTaken);
            return ToList().GetEnumerator();
        }
        finally
        {
            UnfreezeBag(lockTaken);
        }
    }
    return new List<T>().GetEnumerator();
}

private List<T> ToList()
{
    List<T> list = new List<T>();
    for (ThreadLocalList threadLocalList = m_headList; threadLocalList != null; threadLocalList = threadLocalList.m_nextList)
    {
        for (Node node = threadLocalList.m_head; node != null; node = node.m_next)
        {
            list.Add(node.m_value);
        }
    }
    return list;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...