Точка трассировки профиля, почему мой выбор в памяти помечен как медленный

Как бы я улучшить это?

профиль предполагает, что выборка данных из списка происходит медленно

public List<RowDataDto> Rows { get; set; }

public RowDataDto GetRow(int rowNdx)
{
      var row = Rows.SingleOrDefault(x => x.LineNumber == rowNdx);
      return row;   
}

Список будет в среднем содержать около 1000 элементов, которые я просто собираю, чтобы посмотреть, как он работает.

говорят, что самая медленная часть извлекается из списка в памяти.

Rows заполняется задолго до вызова GetRow.

LineNumber - это int32

PS - Я только что установил dotTrace, и я очень новичок в этом, поэтому я не понимаю, как правильно использовать инструмент. У меня есть простые тесты. Я запускаю ".Net Process", приказываю запустить мой тест и в какой-то момент нажимаю "сделать снимок".

Если вы использовали этот инструмент раньше, пожалуйста, направьте меня.

профиль точечной трассировки

1 ответ

Решение

Если у вас есть список в памяти, и вы хотите выполнять определенный поиск много раз, лучше использовать словарь, а не список. Для простоты использования вы можете выставить доступную только для чтения коллекцию значений этого словаря, если вам нужно (обычно не очень хорошо выставлять словарь как открытый член):

private Dictionary<int, RowDataDto> _rows;
public IReadOnlyCollection<RowDataDto> Rows {get {return _rows.Values;}}

public RowDataDto GetRow(int rowNdx)
{
    var row = _rows.ContainsKey(rowNdx) ? _rows[rowNdx] : null;
    return row;   
}

Также обратите внимание, что с помощью SingleOrDefault редко бывает хорошо Если ваш список не должен содержать дубликаты - просто используйте FirstOrDefault, SingleOrDefault придется пройти весь список, чтобы убедиться, что нет дубликатов, что в таком случае означает, что он всегда будет проходить весь список.

Другие вопросы по тегам