Профилирование в Haskell говорит: «общее время = 0,00 с», но это не так - PullRequest
6 голосов
/ 15 июля 2011

Я пытаюсь профилировать свою программу.

Я собираю это так:

ghc -rtsopts -O3 -prof -auto-all Main.hs

И запустить:

./Main +RTS -p

И читать Main.prof:

Fri Jul 15 13:06 2011 Time and Allocation Profiling Report  (Final)

       Main +RTS -p -RTS

    total time  =        0.00 secs   (0 ticks @ 20 ms)
    total alloc = 266,726,496 bytes  (excludes profiling overheads)

COST CENTRE                    MODULE               %time %alloc

trySub                         Main                   0.0   14.3
ourPalindroms                  Main                   0.0   15.0
isPalindromic                  Main                   0.0   70.7


                                                                                               individual    inherited
COST CENTRE              MODULE                                               no.    entries  %time %alloc   %time %alloc

MAIN                     MAIN                                                   1           0   0.0    0.0     0.0  100.0
 CAF                     Main                                                 240          10   0.0    0.0     0.0  100.0
  asSquareSum            Main                                                 253           0   0.0    0.0     0.0    0.0
  squares                Main                                                 252           2   0.0    0.1     0.0    0.1
  maxN                   Main                                                 248           1   0.0    0.0     0.0    0.0
  ourPalindroms          Main                                                 247           1   0.0   15.0     0.0   85.7
   isPalindromic         Main                                                 249     1000000   0.0   70.7     0.0   70.7
  main                   Main                                                 246           1   0.0    0.0     0.0   14.3
   asSquareSum           Main                                                 250        1998   0.0    0.0     0.0   14.3
    trySub               Main                                                 251        1998   0.0   14.3     0.0   14.3
 CAF                     GHC.IO.Handle.FD                                     176           2   0.0    0.0     0.0    0.0
 CAF                     GHC.IO.Encoding.Iconv                                137           2   0.0    0.0     0.0    0.0
 CAF                     GHC.Conc.Signal                                      130           1   0.0    0.0     0.0    0.0

Эта потрясающая скорость моей программы - ложь:

[.../P125]$ time ./Main +RTS -p
...output...

real    0m4.995s
user    0m4.977s
sys 0m0.010s

(Да, я пробовал работать как с * 1016, так и без него, а профилировщик продолжает лгать)

Что я могу сделать?

[.../P125]$ ghc --version
The Glorious Glasgow Haskell Compilation System, version 7.0.3

ОС Mac OS X 10.6.8. Я почти уверен, что установил ghc из доморощенного

1 Ответ

7 голосов
/ 15 июля 2011

Краткий ответ: Обходной путь должен компилироваться с -threaded.

Подробная информация для чрезмерно заинтересованных душ: причина в ошибке GHC (см. # 5282 ): таймер профилированиявсегда срабатывает, когда система времени выполнения хочет выполнить сборку мусора.Поскольку в этот момент выполнение выполняется не в коде на Haskell, затраты относятся к центру затрат "SYSTEM", который затем отбрасывается из представления профилирования.

Причина, по которой -threaded устраняет проблему, заключается в том, чтоэто делает таймер профилирования тикающим в «реальном» времени, а не во время, которое фактически выполнял процесс.Даже несмотря на то, что это менее точная форма профилирования, похоже, что он отсоединяет таймер от выполнения программы, чтобы не вызывать ошибку.

...