작은 테스트 프레임 워크가 있습니다. 다음을 수행하는 루프를 실행합니다.runhaskell 가속화
작은 하스켈 소스 파일을 생성합니다.
runhaskell
으로 실행하십시오. 이 프로그램은 다양한 디스크 파일을 생성합니다.방금 생성 된 디스크 파일을 처리합니다.
이것은 수십 번 발생합니다. runhaskell
이 프로그램 실행 시간의 대부분을 차지하고있는 것으로 나타났습니다.
한편, runhaskell
은 디스크에서 파일을로드하고, 토큰 화하고, 구문 분석하고, 종속성 분석을 수행하고, 디스크에서 20KB 이상의 텍스트를로드하고, tokenise를 처리하고, 전체 유형 유추를 수행하고, 확인합니다. 유형, 코어에 desugar, 컴파일 된 기계 코드에 대한 링크, 통역사에서 물건을 실행, 벽 시간의 2 초 안에 모두 실제로 당신이 그것에 대해 생각할 때 꽤 인상적이다. 다른 한편으로는, 나는 그것을 더 빨리 진행시키고 싶다. ;-)
테스터 (위의 루프를 실행하는 프로그램)를 컴파일하면 약간의 성능 차이가 발생합니다. 스크립트가 링크하는 20KB의 라이브러리 코드를 컴파일하면 눈에 띄게 개선되었습니다. 하지만 호출 당 약 1 초가 걸린다. runhaskell
.
생성 된 Haskell 파일은 각각 1KB를 넘지 만 파일의 한 부분 만 실제로 변경됩니다. 아마도 파일을 컴파일하고 GHC의 -e
스위치를 사용하는 것이 더 빠릅니까?
아니면 OS를 느리게 만드는 많은 OS 프로세스를 반복적으로 만들고 파괴하는 오버 헤드일까요? runhaskell
을 호출 할 때마다 OS가 시스템 검색 경로를 탐색하고 필요한 이진 파일을 찾은 다음 메모리에로드합니다. (물론이 파일은 이미 디스크 캐시에 있습니다.) 모든 DLL에 링크하고 실행하십시오. OS 프로세스를 지속적으로 생성하고 파괴하지 않고 GHC의 한 인스턴스를 (쉽게) 유지할 수있는 방법이 있습니까?
궁극적으로 항상 GHC API가 있다고 가정합니다. 그러나 그것을 이해함에있어서, 악몽 같은 사용하기 어렵고, 문서화가 잘되어 있지 않으며, GHC의 모든 작은 포인트 릴리즈에서 급진적 인 변화를하는 경향이 있습니다. 내가 수행하려고하는 작업은 매우 간단하므로 필요한 것보다 더 복잡한 작업을하고 싶지는 않습니다.
제안 사항?
업데이트 : 전환 GHC -e
에 (즉, 지금 모든가 하나의 표현식이 실행되는 것을 제외하고 컴파일) 측정 가능한 성능 차이를하지 않았다. 이 시점에서 모든 OS 오버 헤드가 매우 명확 해 보입니다. 나는 어쩌면 테스터에서 GHCi로 파이프를 만들어 단 하나의 OS 프로세스 만 사용할 수 있을지 궁금해 ...
전체 워크 플로가 정확하게 성능 목표로 보이지 않습니까? 그렇습니다. 왜 하스켈 코드를 만들어야합니까? – leftaroundabout
분명히 GHC 데몬이 필요합니다! : p (부팅 중에 grep을 계속해서 호출하는 오버 헤드를 피하기 위해 grep 데몬을 만드는 것에 대해 농담하는 사람들이 많습니다.) – ivanm
+1에 대한 정당하고 잘 실행 된 시도가 있습니다. – delnan