我有两个版本的同一个程序,两者之间的变化很小。我使用#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文件中定义的变量)。
答案 0 :(得分:7)
C预处理程序指令仅在编译期间有效。编译器只是删除#ifdef块中的行,然后像往常一样编译程序,因此没有运行时性能损失。