2011-07-02 1 views
2

두 프로그램 사이에 약간의 변경 만 가한 동일한 프로그램이 2 개 있습니다. 별도의 파일을 사용하는 대신 #if defined (PAR) - #else - #endif을 사용하고 -cpp -DPAR을 사용하거나 사용하지 않고 컴파일하여 2 가지 버전간에 전환 할 수 있습니다. 나는 당신이 단 하나 hs 파일에 종사해야하기 때문에이 방법을 좋아한다. 그러나, 내 목표는 원래 프로그램의 병렬/최적화 된 버전을 작성하는 것입니다 이후 #if-#else#-endif 어떤 성능 의미를 사용하여 궁금해? 기본적으로 나는 이것이 후드 아래에서 어떻게 작동하는지에 대한 설명을 원합니다. 감사합니다하스켈에서 # if- # else- # endif 사용

#if defined(PAR) 
import Control.Parallel 
import Control.Parallel.Strategies 
import Control.DeepSeq 
#endif 

#if defined(PAR) 
test = sum (map expensiveFunc myList `using` strat) 
    where strat = parListChunk 100 rseq 
#else 
test = sum (map expensiveFunc myList) 
#endif 

참고 :

예 : 대신 -cpp 플래그의

, 당신이 당신의 소스 파일에 언어 옵션을 사용할 수 있습니다 {-# LANGUAGE CPP #-}

하지만 (xxx는 정의 변수는 HS 파일입니다) 컴파일러가 무시해야 프로그램의 어떤 부분을 선택하기 위해 컴파일 할 때 당신은 여전히 ​​-Dxxx를 제공 (또는하지 않음)해야합니다.

답변

7

전처리 지시문은 컴파일하는 동안에 만 유효합니다. 컴파일러는 #ifdef 블록 내의 라인을 잘라내어 평소대로 프로그램을 컴파일하므로 런타임 성능이 저하되지 않습니다.