在Haskell中使用#if-#else-#endif

时间:2011-07-02 11:39:12

标签: haskell ghc

我有两个版本的同一个程序,两者之间的变化很小。我使用#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标志:

e.g。 {-# LANGUAGE CPP #-}

但是在编译时仍然需要提供(或不提供)-Dxxx以便选择编译器应该忽略的程序部分(其中xxx是hs文件中定义的变量)。

1 个答案:

答案 0 :(得分:7)

C预处理程序指令仅在编译期间有效。编译器只是删除#ifdef块中的行,然后像往常一样编译程序,因此没有运行时性能损失。