Общие рекомендации по сокращению времени GC в GHC - PullRequest
18 голосов
/ 02 марта 2012

Существуют ли общие правила, которым нужно следовать, чтобы выяснить причину, когда скомпилированная GHC программа тратит много времени на сборку мусора? И что будет вообще считаться слишком много? Например, в целом допустимо ли повышение производительности на 60% или это признак того, что с кодом что-то не так?

1 Ответ

10 голосов
/ 03 марта 2012

Вот быстрый и очень неполный список:

  1. Тест и тест.Одна из слабых сторон haskell - это трудность в прогнозировании затрат времени и пространства.Если у вас нет тестовых данных, у вас ничего нет.
  2. Используйте лучшие алгоритмы.Это звучит слишком просто, но оптимизация неэффективных алгоритмов похожа на рэп с ** т золотом.
  3. Стратегически сделать некоторые данные более строгими. Test and Benchmark! Цель состоит в том, чтобы сохранить физически меньшее значение WHNF, а не поток, который его производит, таким образом убирая больше мусора в самом эффективном первом проходе.ищите сложные функции, которые производят простые данные.
  4. Стратегически делает некоторые данные менее строгими. Test and Benchmark! Цель состоит в том, чтобы отложить создание большого количества данных до того, как они будут использованы и отброшены, тем самым убирая больше мусора в самом эффективном первом проходе.Ищите простые функции, которые производят большие сложные данные.См. Также comonads.
  5. Стратегически используйте массивы и распакованные типы, в частности см. # 2.что касается монады ST. Test and Benchmark! Все это помещает больше необработанных данных в меньшую и более компактную память.Меньше мусора для сбора.
  6. Скрипка с настройками RTS (специфично для ghc). Test and Benchmark! Цель состоит в том, чтобы "согласовать импеданс" ГХ с потребностями памяти вашей программы.Здесь я теряюсь еще больше, чем в 1-5, поэтому спросите экспертов об этом.

У лучшего сбора мусора довольно простая предпосылка: создавайте меньше мусора, собирайте его быстрее, производите меньше памяти /deallocations.Любая вещь, которую вы можете сделать, которая может привести к одному из этих трех эффектов, стоит того. Тест и тест!

...