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

最重要的似乎是从 切换foldrfoldl'。还有六种其他有用的优化,但这应该已经有了显着的改进。作为一般经验法则:

  • foldr当您要折叠的函数短路或使用受保护的递归时使用。
  • foldl'否则使用。
  • 根本不要使用foldl
于 2012-09-24T23:51:19.800 回答