2011-07-02 50 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塊中的行,然後像往常一樣編譯程序,所以不存在運行時性能損失。