Найти тему
JuniorCoder

О особенностях работы с данными в dotnet.

Оглавление

Здравствуй, читатель! Сегодня я хотел поделится с тобой своим открытием в сфере разработки на dotnet. Статья коснётся работы со списками.

Предыстория.

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

Сама разработка.

Необходимо было создать WPF приложение, суть которого было работа с большим XML файлом. На задание 2 дня (а я ,на минуточку, работаю днём, а вечером учусь в институте) быстренько бахнул приложение, не в даваясь в особые дебри разработки (исходный код тут, ветка master).

Алгоритм был следующий:

  1. Xmlserializer пробегаюсь по файлу xml.
  2. Пихаю все данные в IEnumerable.
  3. Вывожу на UI.
Свой тест скорости.
Свой тест скорости.

Всё просто. Но в одном потоке занимало это дело почти 11 минут. Не долго думая, создал много объектов Task и всех их запустил.

Тот же алгоритм, но в много потоке.
Тот же алгоритм, но в много потоке.

Ну намного же лучше, правда? Отправил я это дельце на ревизию в компанию. Пришёл ответ.

Простая материализация IEnumerable в список методом ToList()
ускорило тест в 230 раз.

Медленность алгоритма обусловлена использованием IEnumerable, что приводит к постоянному перебору коллекций. Каст к типу List позволил не перебирать каждый раз элементы. Тот же код, но с использованием ToList, можно посмотреть тут (ветка dev).

Тест с преобразованием к List<item>
Тест с преобразованием к List<item>

Теперь тест в одном потоке и в многопотоке проходит всего за 1,8 секунды.

Собственно, на этом всё. Спасибо, что дочитали до конца! Надеюсь, данная статья улучшила твой скилл в разработке на dotnet.


P.S. Этот код прошёл в принципе проверку, на дальнейший этап собеседования меня позвали. На момент написания статьи ожидаю собеседующего из отпуска.