Как реализована поддержка профилирования в GHC? - PullRequest
10 голосов
/ 26 января 2012

Я не нашел много документации в комментарии.Есть ли хорошие посты в блоге или аналогичные по этому поводу?

Ответы [ 2 ]

7 голосов
/ 30 января 2012

Лучшим источником информации о структуре профилирования все еще может быть оригинальная статья Патрика Сансома и Саймона Пейтона Джонса.Дополнительные подробности можно найти в докторской диссертации Sansom , а также в более поздней статье с добавлением формальной спецификации.Саймон Марлоу также рассказал о нескольких недавних изменениях в Обновлении статуса GHC на Мастер-класс по внедрению Haskell 2011 .

Идея профилирования центров затрат заключается в том, чтобы аннотировать дерево выражений с помощью "центра затрат".«узлы, поэтому, например, с -auto-all программа будет иметь аннотации, подобные следующим:

fib n = {-# SCC foo #-} (case n of
                           0 -> 0
                           1 -> 1
                           n -> fib (n-1) + fib (n-2))

Во время выполнения при вводе fib программа будет смотреть на текущий« стек центров затрат »и добавлять«фу "наверх.Это будет отменено, как только оценка снова выйдет за рамки аннотации SCC.Немного магии гарантирует, что если, скажем, n окажется ленивым значением и программе необходимо выполнить свой код, то МВЗ будет соответствовать , чтобы код восстанавливался там, где это необходимо.

Эта инфраструктура затем используется как для временного, так и для пространственного профилирования:

  1. Таймер будет периодически проверять стек МВЗ.Каждый раз, когда обнаруживается определенный стек центров затрат, это считается «галочкой».В конце RTS оценит количество времени на стек центра затрат по количеству его тиков, давая вам временной профиль.

  2. Каждый раз, когда объект выделяется,Программа сохраняет указатель на стек центров затрат, который был текущим на тот момент времени.Это позволяет сборщику мусора предоставлять статистику того, сколько байтов было резидентным, с разбивкой по сайту распределения.

Как и было запрошено в комментарии, несколько слов об оптимизации:Фреймворк не может допустить оптимизаций, которые переносят непостоянные затраты из одного центра затрат в другой, заставляя оптимизатор порой быть довольно пессимистичным.Например, в приведенном выше примере текущая версия GHC не сможет распаковать возвращаемое значение, что означает, что каждый рекурсивный вызов выполняет ненужное выделение кучи.

Как правило, не следует рассчитывать на любые преобразования кода, происходящие в аннотации SCC.В случае сомнений лучше аннотировать функцию достаточно высоко в стеке вызовов, чтобы критичные к производительности биты вообще не аннотировались.

0 голосов
/ 30 января 2012

Вы можете найти этот документ Джонсом, Марлоу и Сингхом полезным, в зависимости от того, чего вы хотите достичь.Он включает в себя методы профилирования программ GHC в параллельном контексте и содержит некоторые тематические исследования, которые могут оказаться полезными.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...