Пожалуйста, сообщите нам о других «полезных советах», которые должны быть здесь!
11.1. Быстрее: создание программы для более быстрого выполнения
-
Don’t use -O or (especially) -O2: -
Используя их, вы сообщаете GHC, что готовы мириться с более длительным временем компиляции для получения кода лучшего качества.
GHC удивительно быстр для обычных компиляций без
-O! - Использовать больше памяти:
-
В разумных пределах, больше памяти для стека означает меньше сборок мусора для GHC, что означает меньшее время компиляции. Если вы используете опцию
-Rghc-timing, вы получите отчет сборщика мусора. (Опять же, вы можете использовать опцию+RTS -S -RTSдля отправки статистики GC напрямую в стандартный вывод.)Если в отчете указано, что на сборку мусора затрачивается более 20% от общего времени, то увеличение памяти может помочь: используйте опцию
-H⟨size⟩(см.-H [⟨size⟩]) . Также может помочь увеличение размера области выделения по умолчанию, используемой RTS компилятора: используйте опцию+RTS -A⟨size⟩ -RTS(см.-A ⟨size⟩).Если GHC продолжает быть плохим пользователем памяти, пожалуйста, сообщите об этом как об ошибке.
- Не используйте слишком много памяти!
-
Как только GHC и его «сограждане» (другие процессы на вашем компьютере) начнут использовать больше, чем реальная память вашего компьютера, и компьютер начнёт «перегружаться», вечеринка окончена. Время компиляции будет хуже, чем ужасно! Используйте что-то вроде встроенной команды csh time, чтобы получить отчет о том, сколько страниц обмена вы получаете.
Если вы не знаете, что такое виртуальная память, перегрузка и страницы обмена, или не знаете конфигурацию памяти вашего компьютера, не пытайтесь быть умными в вопросах использования памяти: вы только усложните себе жизнь (и, вероятно, другим тоже).
- Попытайтесь использовать локальные диски при линковке:
-
Поскольку объекты и библиотеки Haskell, как правило, большие, может потребоваться много реальных секунд, чтобы прочитать/записать биты в/из удалённой файловой системы.
Было бы разумно компилировать на быстром компьютере с удалённо смонтированными дисками, а затем линковать на медленном компьютере с непосредственно смонтированными дисками.
-
Don’t derive/use Read unnecessarily: -
Это уродливо и медленно.
- GHC медленно компилирует некоторые конструкции программ:
-
Мы предпочитаем, чтобы вы сообщали о таком поведении как об ошибке, чтобы мы могли попытаться исправить его.
Чтобы выяснить, какая часть компилятора плохо себя ведёт, опция
-v2вам поможет.
11.2. Быстрее: создание программы, выполняющейся быстрее
Ключевым инструментом для ускорения работы вашей программы Haskell являются средства профилирования GHC, описанные отдельно в Профилирование. Нет замены поиску мест, где действительно тратится время/место программы, а не тех, где вы себе представляете.
Ещё один момент, который следует учитывать: лучший способ значительно улучшить производительность программы — использовать лучшие алгоритмы. После того, как профилирование выявит виновника(ов), замедляющих выполнение, может быть лучше пересмотреть свою программу, чем пробовать все указанные ниже ухищрения.
Ещё один очень эффективный способ ускорить вашу программу — использовать код библиотек, который был серьёзно оптимизирован кем-то другим. Вы можете написать более эффективный быстрый сортировщик, чем тот, что в Data.List, но это займёт у вас гораздо больше времени, чем набрать import Data.List.
Пожалуйста, сообщите о любых слишком медленных программах, скомпилированных с помощью GHC. Поскольку GHC в настоящее время не имеет достойной конкуренции в области производительности, трудно сказать, что означает «слишком медленно», поэтому просто полагайтесь на своё суждение! Конечно, если программа, скомпилированная с GHC, работает медленнее, чем та же программа, скомпилированная с NHC или Hugs, это определённо ошибка.