你好 Stackoverflow 社区。
我对 Haskell 比较陌生,我注意到将大字符串写入文件时
writeFile
速度hPutStr
非常慢。
对于 1.5 Mb 字符串,我的程序(使用 ghc 编译)大约需要 2 秒,而 c++ 中的“相同”代码只需要大约 0.1 秒。该字符串是从包含大约 10000 个元素的列表生成的,然后使用writeFile
. 我还尝试以相同的结果mapM_
遍历列表。hPutStr
有没有更快的方法来写一个大字符串?
更新
正如@applicative 指出的那样,以下代码立即完成了一个 2MB 的文件
main = readFile "input.txt" >>= writeFile "ouput.txt"
所以我的问题似乎出在其他地方。这是我编写列表的两个实现(WordIndex 和 CoordList 是 Map 和 List 的类型别名)
使用 hPutStrLn
-- Print to File
indexToFile :: String -> WordIndex -> IO ()
indexToFile filename index =
let
indexList = map (\(k, v) -> entryToString k v) (Map.toList index)
in do
output <- openFile filename WriteMode
mapM_ (\v -> hPutStrLn output v) indexList
hClose output
-- Convert Listelement to String
entryToString :: String -> CoordList -> String
entryToString key value = (embedString 25 key) ++ (coordListToString value) ++ "\n"
用 writeFile
-- Print to File
indexToFile :: String -> WordIndex -> IO ()
indexToFile filename index = writeFile filename (indexToString "" index)
-- Index to String
indexToString :: String -> WordIndex -> String
indexToString lead index = Map.foldrWithKey (\k v r -> lead ++ (entryToString k v) ++ r) "" index
也许你们可以帮助我在这里找到一个加速。
提前致谢