2013-08-20 34 views
16

Tôi có một tệp nặng TH mất khoảng 30 giây để biên dịch. Tôi có thể sử dụng một số kỹ thuật nào để giúp gỡ lỗi hiệu suất của Mẫu Haskell của tôi?Mẫu hồ sơ Haskell

+0

Tôi đã thực sự phát hiện ra rằng, trong tập tin đã nói, TH chạy ngay lập tức và tất cả thời gian được chi tiêu bởi GHC làm độ phân giải cá thể. Vẫn còn quan tâm đến câu hỏi này mặc dù. –

+2

Có thể bạn có thể tạo [Quasi] (http://hackage.haskell.org/packages/archive/template-haskell/2.8.0.0/doc/html/Language-Haskell-TH-Syntax.html#t:Quasi) Ví dụ cho một số monad chạy trong IO tại thời gian chạy, sau đó bạn có thể sử dụng các công cụ lược tả chuẩn. Các đơn nguyên có thể có một danh sách các thông tin và địa điểm được thống nhất (có thể được tạo ra bởi TH?), Để bạn vẫn có thể sử dụng reify. – bennofs

Trả lời

2

Nếu tôi hiểu dòng chảy biên dịch của TH một cách chính xác, các hàm haskell thông thường đang được thực thi trong khi nối vào thời gian biên dịch. Nhưng bạn có thể chạy sau đó tại thời gian chạy của riêng bạn, tất nhiên.

Ví dụ: bạn có thứ gì đó như $ (foo x y ...) trong tệp TH-nặng của mình. Tạo một tệp khác và gọi 'foo x y' ở đó nhưng không tách kết quả. Sau đó, bạn sẽ có thể hồ sơ 'foo' như bình thường. Nếu nút cổ chai đang ở giai đoạn tạo AST, bạn sẽ định vị nó. Đừng quên xem xét sự lười biếng.

0

Kể từ GHC 8, điều này có thể được thực hiện với -fexternal-interpreter.

Biên dịch thư viện xác định chức năng TH có bật hồ sơ, sau đó biên dịch mã * sử dụng hàm TH trong mối nối với các tùy chọn GHC -fexternal-interpreter -opti+RTS -opti-p. Điều này sẽ tạo ra một tập tin gọi là ghc-iserv-prof.prof.

Cách tiếp cận này có lợi thế là bạn có thể sử dụng đầy đủ chức năng của đơn Q.

* Bộ điểm chuẩn trong cùng một dự án cabal như thư viện TH (nhưng trong một hs-source-dir khác) cũng hoạt động. Nó thậm chí có thể làm việc với một hàm TH được định nghĩa và được sử dụng trong cùng một thư viện, nhưng tôi nghĩ rằng bạn sẽ được lược tả mã giải thích sau đó.