2013-08-20 3 views
16

컴파일하는데 약 30 초가 걸리는 TH- 무거운 파일이 있습니다. Template Haskell의 성능을 디버깅하는 데 사용할 수있는 몇 가지 기술은 무엇입니까?하스켈 프로파일 링 템플릿

+0

실제로 파일을 보면 TH가 즉시 실행되고 GHC가 인스턴스를 확인하는 데 항상 시간이 소비된다는 사실을 발견했습니다. 그래도이 질문에 관심이 있습니다. –

+2

어쩌면 당신은 [Quasi] (http://hackage.haskell.org/packages/archive/template-haskell/2.8.0.0/doc/html/Language-Haskell-TH-Syntax.html#t:Quasi)를 만들 수 있습니다. 런타임시 IO에서 실행되는 일부 모나드의 경우, 표준 프로파일 링 도구를 사용할 수 있습니다. 모나드는 reified Info 및 Locations (TH로 생성 될 수 있음) 목록을 가질 수 있으므로 reify를 계속 사용할 수 있습니다. – bennofs

답변

2

TH의 컴파일 흐름을 올바르게 이해했다면, 컴파일 할 때 일반 haskell 함수가 실행 중입니다. 그러나 당신은 당연히 런타임에서 스스로 실행할 수 있습니다.

예를 들어, TH- 중량 파일에는 $ (foo x y ...)와 같은 것이 있습니다. 다른 파일을 만들고 'foo x y'를 호출하지만 결과를 연결하지 않습니다. 그러면 평소와 같이 'foo'를 프로파일 링 할 수 있습니다. 병목 현상이 AST 생성 단계에있는 경우 찾아냅니다. 게으른 것을 잊지 마세요.

0

GHC 8부터는 -fexternal-interpreter을 사용할 수 있습니다.

프로파일 링을 사용하여 TH 기능을 정의하는 라이브러리를 컴파일 한 다음 GHC 옵션 -fexternal-interpreter -opti+RTS -opti-p이있는 스플 라이스에서 TH 기능을 사용하는 코드 *를 컴파일하십시오. 그러면 ghc-iserv-prof.prof이라는 파일이 생성됩니다.

이 접근 방식은 Q 모나드의 모든 기능을 사용할 수 있다는 이점이 있습니다.

* TH 라이브러리 (다른 hs-source-dir에 있음)와 동일한 cabal 프로젝트의 벤치 마크 제품군도 작동합니다. 동일한 라이브러리에서 정의되고 사용되는 TH 함수로도 작동 할 수 있습니다. 그런 다음 해석 된 코드를 프로파일 링 할 것입니다.