Derlemem yaklaşık 30 saniye süren TH ağır bir dosyam var. Template Haskell'in performansının hatalarını ayıklamak için kullanabileceğim bazı teknikler nelerdir?Profil Şablonu Haskell
cevap
TH'nin doğru akışını doğru olarak anlarsam, derleme zamanında ekleme yaparken sıradan hata işlevleri çalıştırılır. Ama daha sonra çalışma zamanında kendi başınıza koşabilirsiniz. Örneğin, TH ağır dosyanızda $ (foo x y ...) gibi bir şeyiniz var demektir. Başka bir dosya oluşturun ve orada 'foo x y' ifadesini arayın, ancak sonucu eklemeyin. Daha sonra her zamanki gibi 'foo' profillerini takip edebileceksiniz. Eğer darboğaz AST nesil aşamasında ise onu bulacaksınız. Tembelliği düşünmeyi unutma.
GHC 8'den itibaren, bu -fexternal-interpreter ile yapılabilir.
TH işlevini tanımlayan kitaplığı, profilleme etkinleştirilmiş olarak derleyin ve daha sonra TH işlevinin GHC seçenekleri -fexternal-interpreter -opti+RTS -opti-p
ile birleşiminde TH işlevini kullanan kodu * derleyin. Bu, ghc-iserv-prof.prof
adlı bir dosya oluşturmalıdır.
Bu yaklaşım, Q
monad'ın tüm işlevlerini kullanabilmeniz avantajına sahiptir.
* TH kütüphanesi (ancak farklı bir hs-source-dir) ile aynı kabaca projede bir benchmark paketi de çalışır. Aynı kitaplıkta tanımlanmış ve kullanılmış bir TH işleviyle bile çalışabilir, ancak sonradan yorumlanmış bir kod oluşturacaksınız.
Aslında, bu dosyada TH'nin anında çalıştığını ve her zaman GHC'nin örnek çözünürlükte harcadığını öğrendim. Yine de bu soruyla ilgileniyorum. –
Belki bir [Quasi] yapabilirdiniz (http://hackage.haskell.org/packages/archive/template-haskell/2.8.0.0/doc/html/Language-Haskell-TH-Syntax.html#t:Quasi) Çalışma zamanında IO'da çalışan bazı monadlar için, standart profilleme araçlarını kullanabilirsiniz. Monad reify Info ve Locations (belki de TH tarafından oluşturulmuş) bir listesini olabilir, böylece reify hala kullanabilirsiniz. – bennofs