2011-07-02 25 views
2

我有两个版本的同一个程序,两者之间只有很小的变化。我使用#if defined (PAR) - #else - #endif,然后在有或没有-cpp -DPAR的情况下编译,以在两个版本之间切换。我喜欢这种方式,因为你只需要处理一个hs文件。但是,由于我的目标是编写原始程序的并行/优化版本,我不知道使用#if-#else#-endif是否有任何性能影响?基本上我想解释一下这是如何工作的。由于在Haskell中使用#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

C预处理指令仅在编译期间生效。编译器简单地删除#ifdef块中的行,然后像往常一样编译程序,所以不存在运行时性能损失。