#haskell #profiling #ghc
#haskell #профилирование #ghc
Вопрос:
Я скомпилировал программу Haskell с GHC с включенным профилированием.
$ ./ server RTS -M6m -p -RTS
Я получаю профиль, подобный:
individual inherited
COST CENTRE MODULE no. entries %time %alloc %time %alloc
poke_a4u64 Generator 2859 56436 0.0 0.0 0.4 0.4
storeParameter Generator 2860 0 0.4 0.4 0.4 0.4
ppCurrent Generator 2866 56436 0.0 0.0 0.0 0.0
ppFeedback Generator 2861 56436 0.0 0.0 0.0 0.0
Похоже, что storeParameter никогда не вызывается, но потребляет время и память. Поскольку storeParameter вызывает ppCurrent, я предполагаю, что storeParameter вызывается 56436 раз, как и ppCurrent. Почему не отображается?
Комментарии:
1. Было бы очень полезно просмотреть код, который вы профилируете, если это возможно.
Ответ №1:
Это ошибка в профилировании ghc. Я не знаю об обходном пути, но Simon M пообещал улучшения в следующем выпуске.
Комментарии:
1. У вас есть ссылка на билет GHC Trac?
2. Я не могу вспомнить, есть ли билет Trac, но я говорил об этом с Саймоном М.
Ответ №2:
Я обнаружил entries
, что столбец находится в моем собственном коде: например main
, вызывается 6 раз!
Так что я бы не стал слишком беспокоиться об этом.
Комментарии:
1.
entries
это не количество раз, когда вызывается функция. Это количество раз, когда был введен узел графа вызовов. Это не одно и то же.2. @JohnL: и все же, почему
main
узел графа вызовов должен вводиться более одного раза? Никакой рекурсии или чего-либо еще: просто выполните прямое «считывание параметров из командной строки, распечатайте некоторые данные в стандартный вывод, оцените чистую функцию и сохраните ее результаты на диске».3. это предположение с моей стороны, но, возможно, возврат к
main
из системного вызова имеет значение? Было бы неплохо, если бы документация была немного более подробной.