Как заставить профилировщик ghc шагнуть глубже в библиотеки? - PullRequest
4 голосов
/ 04 марта 2011

Я пытаюсь профилировать мою программу.Поэтому я компилирую его с флагами -prof и -auto-all и запускаю с -P, чтобы получить подробный отчет о профилировании:

$ ghc --make -prof -auto-all Test.hs
$ ./Test +RTS -P

Вот часть отчета о профилировании:

COST CENTRE              MODULE  no.    entries  %time %alloc

  main                   Main   266           1   0.0    0.0
   run                   Main   273       21845  99.3   99.7
    sz                   Main   274       21844   0.0    0.0
   size                  Main   268       21845   0.7    0.3

Кажется, что run потребляет все время и память.Он вызывает множество функций из разных библиотек, и я совершенно уверен, что большая часть времени тратится на одну из них, но я не могу понять, в какой именно.Как я могу получить более подробный отчет?Я надеюсь, что установка большого количества аннотаций SCC вручную - не единственный способ.

Обновление .Пока что я «решил» проблему, скопировав исходники библиотек в каталог моей программы.Это позволяет GHC рассматривать их как часть программы, а не как внешние библиотеки.

Ответы [ 2 ]

4 голосов
/ 04 марта 2011

Чтобы профилировщик различал библиотечные функции, на них должны быть аннотации центра затрат. Вы можете сделать это двумя способами:

  1. Перекомпилируйте интересующие библиотеки с помощью -p -auto, чтобы функции библиотеки были аннотированы с помощью SCC.
  2. Вставьте аннотации SCC вокруг вероятных трудоемких вызовов библиотеки в вашем коде.
1 голос
/ 04 марта 2011

Это профилировщик типа gprof - довольно слабый по этим причинам.

Вы можете использовать GHCi , чтобы находить проблемы с производительностью так же, как и бесконечныециклы, по этой методике следующим образом:

6.3 Бесконечные циклы 21 ноября 2007 г. пользователям glasgow-haskell Пепе сделал следующее предложение по обнаружению причин бесконечных циклов вGHCi.Предполагая, что нарушающая функция имеет имя loop и принимает один аргумент:

1. Включите флаг -fbreak-on-error (:set -fbreak-on-error в GHCi)

2. Выполните ваше выражениес помощью: trace (:trace loop 'a')

3.hit Ctrl-C, пока ваша программа застревает в цикле, чтобы иметь разрыв отладчика в цикле

4.use: history и: backчтобы выяснить, где находится цикл и почему.

Единственная разница между любой проблемой производительности и бесконечным циклом состоит в том, что бесконечные циклы тратят впустую 100% времени, в то время как проблемы производительности расходуют меньший процент.Так что вам, возможно, придется взломать его несколько раз.

...