straktor: benders (Default)
straktor ([personal profile] straktor) wrote2019-11-19 12:48 pm

Rust performance (хобби)

Решил пощупать, как оно там в Расте со сложными структурами данных, типа ориентированного графа.
Закодил топологическую сортировку, тупой "в лоб" вариант, с тупыми "в лоб" векторами и хэшмапами; борров чекера порешал клонами. Нашёл набор графов, выбрал в 50К, 300К и 1.7М рёбер.

Запускаю, 50К за 2 минуты, 300К будет явно часы. Много или мало? Нарисовал рядом тривиальный перевод на джавке. Быстрее в 6 раз. Мал-мало оптимизнул с хешкодом-равно-финалы-параллель, валит в 11 раз быстрее. Ну, может у меня клешни с растом? Сделал без клона стрингов, индексами -- стало побыстрее. На 1.7М запускаю, джавка 1.5 часа, раст в 20 раз медленнее. ЧТО? КАК?
Более того, само чтение 22 Мб на явке 200 мс, в расте 1.8 с. Явка при этом в уникод переводит.

В стековерфлоу коллегам советуют: а пробаните -O оптимизацию. Пробую. Ёжики! Чтение 180мс, сортировка 1.7М за 47 минут. Что ж ты, падла, фуфло сразу гнала?

Из неожиданных находок. Оказывается, полная итерация по хэшмапу в 1.7М + удаление из него 10 элементов МЕДЛЕННЕЕ, чем то же по списку-массиву. Удаление из массива, Карл!
Ещё находка: удаление из массива тупо 10 раз по 1 штуке (копирует в среднем половину) быстрее, чем removeAll(hashSet(list10)). Никогда бы не подумал.