Здравствуй, читатель! Сегодня я хотел поделится с тобой своим открытием в сфере разработки на dotnet. Статья коснётся работы со списками.
Предыстория.
В последнее время часто задумываюсь, что я работаю не там, где нужно. В настоящее время большую часть работы занимает доработка кода под актуальную документацию. Ну и с августа этого года подыскивал работу.
И на одном из собеседование предложили выполнить тестовое задание.
Сама разработка.
Необходимо было создать WPF приложение, суть которого было работа с большим XML файлом. На задание 2 дня (а я ,на минуточку, работаю днём, а вечером учусь в институте) быстренько бахнул приложение, не в даваясь в особые дебри разработки (исходный код тут, ветка master).
Алгоритм был следующий:
- Xmlserializer пробегаюсь по файлу xml.
- Пихаю все данные в IEnumerable.
- Вывожу на UI.
Всё просто. Но в одном потоке занимало это дело почти 11 минут. Не долго думая, создал много объектов Task и всех их запустил.
Ну намного же лучше, правда? Отправил я это дельце на ревизию в компанию. Пришёл ответ.
Простая материализация IEnumerable в список методом ToList()
ускорило тест в 230 раз.
Медленность алгоритма обусловлена использованием IEnumerable, что приводит к постоянному перебору коллекций. Каст к типу List позволил не перебирать каждый раз элементы. Тот же код, но с использованием ToList, можно посмотреть тут (ветка dev).
Теперь тест в одном потоке и в многопотоке проходит всего за 1,8 секунды.
Собственно, на этом всё. Спасибо, что дочитали до конца! Надеюсь, данная статья улучшила твой скилл в разработке на dotnet.
P.S. Этот код прошёл в принципе проверку, на дальнейший этап собеседования меня позвали. На момент написания статьи ожидаю собеседующего из отпуска.