2013-08-20 17 views
16

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

+0

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. –

+2

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

cevap

2

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.

0

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.