Шаблон профилирования Haskell

У меня есть TH-тяжелый файл, который занимает около 30 секунд для компиляции. Какие методы я могу использовать, чтобы помочь отладить производительность моего шаблона Haskell?

Ответы

Ответ 1

Если я правильно понимаю поток компиляции TH, обычные функции haskell выполняются во время сращивания во время компиляции. Но вы, конечно, можете запускать его на время выполнения самостоятельно.

Например, у вас есть что-то вроде $(foo x y...) в вашем TH-тяжелом файле. Создайте еще один файл и вызовите 'foo x y', но не соедините результат. Тогда вы сможете профилировать "foo", как обычно. Если узкое место находится на стадии генерации АСТ, вы найдете его. Не забудьте рассмотреть ленивость.

Ответ 2

Как и в GHC 8, это можно сделать с помощью - fexternal-interpreter.

Скомпилируйте библиотеку, определяющую функцию TH с включенным профилированием, затем скомпилируйте код *, который использует функцию TH в сращивании с параметрами GHC -fexternal-interpreter -opti+RTS -opti-p. Это должно создать файл с именем ghc-iserv-prof.prof.

Этот подход имеет то преимущество, что вы можете использовать полную функциональность монады Q.

* Также работает эталонный набор в том же проекте cabal, что и библиотека TH (но в другом hs-source-dir). Это может даже работать с функцией TH, определенной и используемой в той же библиотеке, но я думаю, что вы будете профилировать интерпретируемый код.