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

vis*_*vis 2 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
Run Code Online (Sandbox Code Playgroud)

注意:

-cpp您可以使用源文件中的语言选项而不是标志:

例如 {-# LANGUAGE CPP #-}

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

Ant*_*tti 7

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