2011-07-02 18 views
2

同じプログラムの2つのバージョンがあり、2つのバージョンの間にはほとんど変更がありません。別のファイルを使用する代わりに、#if defined (PAR) - #else - #endifを使用し、-cpp -DPARの有無にかかわらずコンパイルして、2つのバージョンを切り替えることができます。あなたはただ一つの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ブロック内の行を切り取り、通常どおりプログラムをコンパイルするので、実行時のパフォーマンス上のペナルティはありません。

関連する問題