高速化のコツ
+RTS -N を安易に使わない
なぜかstackはこれをデフォルトで指定するが、これでプログラムが速くなることは99%ないといってよい。というのも、ただでさえGCの多いHaskellにおいて、GCが要求されるたびにプログラム全体を止めて同期を取るというきわめて高コストな操作をするからだ。ベンチマークして速くなるという証拠が得られない限り、これはただプログラムを遅くするだけの戯れにすぎない。仮にマルチコアで実行する際も、-qn4のようにGCに使うコア数は抑えるか-qgで並列GCをオフにしておくべきだろう。 安易に並列化で解決しようとしない
並列処理は複数のコアでデータを処理するが、そもそも全体の計算量が減るわけではなく、パフォーマンスを改善するには最適な粒度で計算を切り分ける必要がある。コア数を増やしてその平方根分改善できれば上々だが、少なくとも最適化のために真っ先に試すことではない。
入門書のようにナンニデモ=リストのままでは、満足に大きなデータは扱えないしGCへの負担が大きい。どのような操作が求められているのかを明確にし、目的に合った構造を選択しよう。
積極的にインライン化またはスペシャライズする
多相性を含むコードでは、型クラス制約のための辞書を引きまわしていると効率が悪くなるが、うまくインライン化できれば単相なコードと同じような結果が得られる。
baseパッケージのText.Printfは驚くほどに遅い。どんなプログラムで使ってもボトルネックになることは必至だ。