стек профилирование пропуская центры затрат в зависимости - PullRequest
0 голосов
/ 20 марта 2020

Я пытаюсь профилировать свою программу, использующую библиотеку hashables и другие. Я не хочу профилировать зависимости моего кода, я просто хочу профилировать свой код (и, возможно, точки входа зависимостей). Я строю с stack build --profile или stack build --executable-profile, и я всегда получаю шум, подобный этому, в моем профиле (следующее из вывода profiterole). Как я могу пропустить все это и только код профиля из моего пакета?

...


48.8  10.9   3.5  Data.Hashable.Generic ghashWithSalt (7601904)
45.3   7.5   4.6    Data.Hashable.Generic ghashWithSalt (6569085)
26.9    .3    .3      Data.Hashable.Generic hashSum (3165747)
 6.0   2.3   1.7      Data.Hashable.Generic ghashWithSalt (558817)
 1.6     -     -        Data.Hashable.Generic hashSum (432539)
 1.6    .2    .1        Data.Hashable.Class hashWithSalt (386021)
  .2    .1     -          Data.Hashable.Class hashWithSalt (0)
  .2    .1    .1            Data.Hashable.Class defaultHashWithSalt (186852)
  .1     -     -              Data.Hashable.Class combine (186852)
  .1     -     -          Data.Hashable.Class hashWithSalt1 (0)
  .1     -     -            Data.Hashable.Class liftHashWithSalt (7458)
  .6    .4    .2        Data.Hashable.Class liftHashWithSalt (61434)
  .4    .3    .1          Data.Hashable.Class liftHashWithSalt.step (614548)
  .3    .1    .1            Data.Hashable.Class hashWithSalt (0)
  .2     -     -              Data.Hashable.Class defaultHashWithSalt (614548)
  .1     -     -                Data.Hashable.Class hash (0)
   -     -     -                Data.Hashable.Class combine (614548)
   -     -     -          Data.Hashable.Class liftHashWithSalt.finalise (61434)
   -     -     -            Data.Hashable.Class hashWithSalt (0)
   -     -     -              Data.Hashable.Class defaultHashWithSalt (61434)
   -     -     -                Data.Hashable.Class combine (61434)
  .4     -     -        Data.Hashable.Generic ghashWithSalt (0)
  .4     -     -          Data.Hashable.Generic hashSum (206676)
  .1     -     -        Database.FluiDB.CnfQuery.Types hashWithSalt (70236)
 4.0    .1     -      Data.Hashable.Class hashWithSalt (128078)
  .2    .1    .1        Data.Hashable.Class defaultHashWithSalt (126035)
   -     -     -          Data.Hashable.Class combine (48982)
 3.5     -     -      Data.HashMap.Base hashWithSalt (116920)
  .2     -     -      Database.FluiDB.Cluster.Types.Clusters hashWithSalt (0)


28.7  10.0   2.7  Data.Hashable.Class liftHashWithSalt (539054)
 9.4   1.4    .4    Data.Hashable.Class defaultLiftHashWithSalt (105)
 6.1    .2    .2      Data.Hashable.Class hashWithSalt (90103)
 2.1     -     -        Data.Hashable.Generic ghashWithSalt (264200)
 2.3    .8    .6      Data.Hashable.Class liftHashWithSalt2 (506010)
 1.5    .2    .1        Data.Hashable.Class hashWithSalt (126670)
 1.3    .1     -          Data.Hashable.Generic ghashWithSalt (232657)
  .1    .1    .1            Data.Hashable.Generic hashSum (27468)
  .2     -     -        Data.Hashable.Class combine (195731)
  .6     -     -      Data.HashMap.Base hashWithSalt (846)
 8.8   5.3   2.3    Data.Hashable.Class liftHashWithSalt.step (10374784)
 6.1   3.0    .6      Data.Hashable.Class hashWithSalt (55681)
 5.0   2.4   2.1        Data.Hashable.Class defaultHashWithSalt (9979602)
 1.5     -     -          Data.Hashable.Class combine (8942838)
 1.5    .3    .3          Data.Hashable.Class hash (0)
  .4     -     -        Data.Hashable.Generic ghashWithSalt (164889)
  .4     -     -      Database.FluiDB.Cluster.Types.Clusters hashWithSalt (116428)
 7.2    .1    .1    Data.Hashable.Class hashWithSalt (211986)
 7.1     -     -      Data.Hashable.Generic ghashWithSalt (522861)
  .7    .5    .1    Data.Hashable.Class liftHashWithSalt.finalise (218121)
  .6    .3    .1      Data.Hashable.Class hashWithSalt (0)
  .5    .3    .3        Data.Hashable.Class defaultHashWithSalt (198539)
  .2     -     -          Data.Hashable.Class combine (98093)

...

1 Ответ

0 голосов
/ 21 марта 2020

К сожалению, я думаю, что лучший способ сделать это в настоящее время - это использовать для каждого пакета ghc-options особенность файла c stack.yaml, определяемого проектом, чтобы явно отключить автоматическое генерирование c CAF для внешних зависимостей. В своем файле stack.yaml ( не package.yaml или .cabal файл) вы можете добавить:

ghc-options:
  hashable: -fno-prof-auto

и затем выполнить:

stack build --profile
stack exec --profile -- myProgram +RTS -p

как обычно.

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

Кроме того, хотя есть флаги "$everything" и "$locals, которые могут использовать, чтобы можно было предположить, что сработает следующее:

ghc-options:
  "$everything": -fno-prof-auto
  "$locals": -fprof-auto

В документации стека неясно, как они разрешаются, и имеется несколько нечетких предупреждений о том, что флаг "$everything" опасен. Я никак не мог заставить его работать.

...