1

単純なファイル パーサーを pythonto haskell に書き直そうとしましたが、非常に遅いことがわかりました (同じマシンで約 15 倍遅い)。ghc -O2 でコンパイルされたコード。

目標は、正規表現が一致する行数をカウントすることです。サンプル テキスト ファイルは巨大です (数 GiB)。

コードは次のとおりです。

import Text.Regex.Posix
import qualified Data.ByteString as BS
import qualified Data.ByteString.Char8 as BC

filename = "sample.dat"

mcount' :: String -> [BS.ByteString] -> Int
mcount' sample file = foldr (\e acc -> if e =~ sample then acc+1 else acc) 0 file

main = do
    fcnt <- fmap BC.lines $ BS.readFile filename
    print $ mcount' "myregex" fcnt

パフォーマンスを (大幅に) 改善するにはどうすればよいですか?

4

1 に答える 1

4

最も重要なことは、 からfoldrへの切り替えのようfoldl'です。他にも便利な最適化が半ダースありますが、すでに大幅な改善が行われているはずです。一般的な経験則として:

  • foldrフォールディングしている関数がショートサーキットであるか、保護された再帰を使用している場合に使用します。
  • それ以外の場合は使用してくださいfoldl'
  • 絶対に使わないfoldlでください。
于 2012-09-24T23:51:19.800 に答える