Точка трассировки профиля, почему мой выбор в памяти помечен как медленный
Как бы я улучшить это?
профиль предполагает, что выборка данных из списка происходит медленно
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
придется пройти весь список, чтобы убедиться, что нет дубликатов, что в таком случае означает, что он всегда будет проходить весь список.