Использование # if- # else- # endif в Haskell - PullRequest
2 голосов
/ 02 июля 2011

У меня есть 2 версии одной и той же программы с небольшими изменениями между ними.Вместо отдельных файлов я использую #if defined (PAR) - #else - #endif, а затем компилирую с или без -cpp -DPAR для переключения между двумя версиями.Мне нравится этот способ, так как вам нужно работать только с одним файлом hs.Однако, поскольку моя цель - написать параллельную / оптимизированную версию исходной программы, мне интересно, если использование #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 #-}

Но вам все равно нужно предоставить (или нет) -Dxxx при компиляции, чтобы выбрать, какую часть программы компилятор должен игнорировать (где xxx - это определенная переменная в файле hs).

1 Ответ

7 голосов
/ 02 июля 2011

C директивы препроцессора действуют только во время компиляции.Компилятор просто вырезает строки в блоке #ifdef, а затем компилирует программу, как обычно, так что нет снижения производительности во время выполнения.

...