Одной небольшой оптимизацией является фильтрация данных (используя HashMap.filter
) перед их сортировкой.Это помогло мне сбить 2 секунды с окончательного времени выполнения.Я также использовал последовательности (Data.Sequence
) вместо списков (без заметной разницы :-(). Мою версию можно найти здесь .
Просмотр кучипрофиль, я не думаю, что в вашей программе есть утечка пространства: ![Space profile](https://i.stack.imgur.com/k7bss.png)
Вы просто создаете довольно большую хэш-таблицу (377141 пар ключ-значение) в памяти, а затем отбрасываете еепосле некоторой обработки. Согласно посту Йохана , хеш-таблица такого размера занимает приблизительно 5 * N + 4 * (N-1) слов = 3394265 * 4 байта ~ = 13 МБ, что согласуется с тем, чтопрофиль кучи показывает. Оставшееся место занимают ключи и значения. На моей машине время, проведенное в GC, составляет около 40%, что не кажется необоснованным, если вы постоянно обновляете хэш-таблицу и временные стеки.", не делая с данными ничего сложного для вычислений. Поскольку единственная операция, для которой вам нужна хеш-таблица, это insertWith
, возможно, лучше использовать изменяемая структура данных ?
Обновление : Я переписал вашу программу с помощью изменяемой хеш-таблицы. Интересно, что разница в скорости невелика, но использование памяти немного лучше:
![enter image description here](https://i.stack.imgur.com/VSuXj.png)
Как видите, размер блока, выделенного для хеш-таблицы, остается постоянным на протяжении всего выполнения.